2013-02-15 96 views
0

最近,我已经开始准备定期报告过程的数据市场,并尝试使用带参数的过程。使用循环和立即执行的过程

所以我读了this guideline并试图复制,但在编译时遇到了错误。

这里是我的代码:

create or replace procedure mig_rate @rep_date date AS 
    create or replace table mig_temp1(
    report_date date, 
    portfolio string, 
    bucket integer, 
    Q integer); 
begin  
    for j in 1..7 loop 
     for t in 0..32 loop 
     -- execute immediate 'bla-bla-bla insert statement mig_temp1 
     end loop; 
    end loop; 
end 

这导致PLS-00103@符号是出乎意料的。

语法有什么问题,我该如何将参数放入过程?

回答

0

最主要的错误是您尝试在Oracle数据库中使用SQL Server语法。

首先,甲骨文object names have to start with a letter(除非你使用带引号的标识符,但请不要)和......嗯,这里有相关部分:

不带引号的标识符必须从 字母开头您数据库字符集。带引号的标识符可以以任何 字符开头。

非引用标识符只能包含 数据库字符集和下划线(_),美元符号($), 和井号(#)中的字母数字字符。数据库链接还可以包含句点(。)和“at”(@)处的 。 Oracle强烈建议您不要使用$和# 非引用标识符。

引用的标识符可以包含任何字符和标点符号 以及空格。但是,引号和非引号标识符 都不能包含双引号或空字符(\ 0)。

...所以你根本不能在程序名中使用@,并且不需要这样做,因为这是SQL Server的东西(我想我不使用它!)。

编辑:看到我对SQL Server非常陌生,我误解了它在做什么。你的程序名称是可以的,但这不是你声明参数的方式;它应该开始:

create or replace procedure mig_rate(rep_date date) as 
... 

其次,你不能Oracle过程中创建(申报吗?)那样的表​​。看起来你在过程期间想要一个临时表,但这不是Oracle的工作方式;您可以在过程外部创建全局临时表,但它是永久数据库对象 - 只有数据是临时的。

您可以使用PL/SQL collection来代替它,但它取决于您想要用它做什么。如果在插入普通表之前它是一个临时区域,那么您可以将其作为单个SQL命令来执行,该命令的执行效果会更好。

我不确定你为什么想在这里使用动态SQL(execute immediate)...

请参阅PL/SQL language reference和Oracle特定的网站,而不是SQL Server特定的网站,了解做什么;他们的工作方式有很大差异。

+0

Alex!大感谢您的回答,我已经离开了while.I我要学习你的链接,然后可能我会想出一些新的问题!) 我想用执行mmediate的原因是表我引用有像X_1,X_2列名,X_3 ......所以我想遍历他们在“为吨0..32循环” – user2074685 2013-02-26 06:14:38