在Oracle中创建一个过程来创建视图

3

我正在尝试在Oracle中创建一个过程,当从PL SQL块中调用时,将在数据库中创建一个视图,我将从该视图中查询数据以生成报告。我是Oracle的新手,需要帮助编写此代码。

CREATE OR REPLACE PROCEDURE CREATE_VIEW 
(
  TO_DT IN Date 
) AS 
BEGIN
  Create or Replace view BORR_DUR As
  SELECT e."Deal_No", (Select "DeskName" From MM_S_DESK Where e."DeskCode" = MM_S_DESK."DeskCode") Facility, e."Remarks" Counterparty, 
m."MaturityDate", m."PriRedem" Principal, 

(select MAX("INTEREST_RATE") from MM_BOR_PLA_PAR d 
WHERE e."Deal_No" = d."DEAL_NO" and "INTERESTINPUTDATE" <= to_dt)/100 yield, (m."MaturityDate" - To_date(to_dt,'dd/mm/yyyy')) Days_to_Mat,
Round(((m."MaturityDate" - To_date(to_dt,'dd/mm/yyyy'))/365)/ (1+((select MAX("INTEREST_RATE") from MM_BOR_PLA_PAR d 
WHERE e."Deal_No" = d."DEAL_NO" and "INTERESTINPUTDATE" <= to_dt)/100)),4) MDURATION


FROM MM_T_BORROWING e, MM_T_BORROWING_PM_DETAIL m
Where e."DeskCode" in ('10','11','12','13') and e."Value_Date" <= to_dt and e."Maturity_Date" > to_dt and e."Status" not in ('C', 'D', 'Z', '0','X') 
and e."Deal_No" = m."Deal_No" and "PriRedem" > '0' and m."MaturityDate" > to_dt;

END CREATE_VIEW;

在编译时,我遇到了PLS00103错误,它说:

遇到符号“Create”而期望以下之一...

如果您能帮助解决此问题,将不胜感激。


你需要做类似于 EXECUTE IMMEDIATE 'CREATE or REPLACE .....' 这样的操作,整个语句都放在 execute immediate 内部。 - undefined
为什么你想要这样做呢?相比于直接运行CREATE VIEW语句,编写一个过程会给你带来什么好处呢? - undefined
我宁愿运行一个语句,但是在PL SQL中直接运行变得困难,6i中没有可用的Execute Immediate,而简单的execute或execute query对我来说也不起作用。 - undefined
1个回答

1

当您想要执行动态SQL语句时,必须使用EXECUTE IMMEDIATE语句。

首先,您不需要在字段名称中使用双引号,然后可以尝试视图查询并检查是否运行无误。

将创建替换视图的语句放入变量中,在您的过程调用中使用:

BEGIN
   EXECUTE IMMEDIATE view_string_variable ;
END;
/

创建视图的查询工作得很好,执行了所需的操作。但是当我将语句放入变量中,例如 'view_string_variable ('Create or Replace view Borr_Dur As.....' 时,我会收到以下错误信息:Error(11,22): PLS-00103: 遇到符号“(”,但需要以下符号之一:常量、异常<标识符>、双引号限定的标识符、表、长整型、双精度浮点型、引用、字符、时间戳、时间间隔、日期、二进制、国家字符或nchar。 - undefined
你的一个语法错误(需要括号)在这里 "INTERESTINPUTDATE" <= to_dt)/100 yield ,我建议你删除不必要的双引号,对于字符串,你应该将所有内容放在单引号之间,但是当你的脚本中有单引号时,为了避免语法错误,你需要将其放在双引号之间。例如 (''10'',''11'',''12'',''13'') - undefined
这正是我的问题所在,我尝试了一个简单的查询,它起作用了,除此之外一切都很好,只是我在查询中传递的值是字符串,而查询本身也是字符串。因此,像('10','11')等值无法编译。我已经尝试用双引号替换单引号,但没有帮助。 - undefined
为什么需要给数字加引号?它们被声明为varchar类型吗?如果不是,请从那里删除引号。 - undefined
问题已解决,实际上我需要使用两个单引号 '' ,而我之前使用的是双引号 " ,这导致了问题。谢谢你的帮助,Frank。非常感激。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接