循环和立即执行的过程

时间:2013-02-15 08:39:55

标签: oracle pls-00103

最近我开始为定期报告流程准备数据集,并尝试使用带参数的程序。

所以我读了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@符号是意料之外的。

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

1 个答案:

答案 0 :(得分:0)

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

首先,Oracle object names have to start with a letter(除非您使用带引号的标识符,但请不要使用)和......好吧,这里是相关部分:

  

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

     

不带引号的标识符只能包含来自的字母数字字符   您的数据库字符集和下划线(_),美元符号($),   和英镑符号(#)。数据库链接还可以包含句点(。)和   “at”标志(@)。 Oracle强烈反对使用$和#in   不带引号的标识符。

     

带引号的标识符可以包含任何字符和标点符号   以及空间。但是,既没有引用也没有引用标识符   可以包含双引号或空字符(\ 0)。

...所以你不能在程序名中使用@,并且不需要因为那是SQL Server的东西(我想,我不使用它!)。< / p>

编辑:看,我对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特定的站点来了解该做什么;他们的工作方式存在很大差异。