0

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

因此,我阅读了此指南并尝试复制,但对编译错误感到困惑。

这是我的代码:

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@符号是意外的。

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

4

1 回答 1

0

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

首先,Oracle对象名称必须以字母开头(除非您使用带引号的标识符,但请不要)并且......好吧,以下是相关部分:

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

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

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

...所以您根本不能@在过程名称中使用,也不需要因为这是 SQL Server 的事情(我认为,我不使用它!)。

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

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

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

您可以改用PL/SQL 集合,但这取决于您想用它做什么。如果它是插入普通表之前的暂存区,那么您可以将其作为单个 SQL 命令执行,这样会更好。

我不确定您为什么要execute immediate在此处使用动态 SQL ( ) ...

请参阅PL/SQL 语言参考和 Oracle 特定站点而不是 SQL Server 特定站点以了解如何操作;它们的工作方式存在很大差异。

于 2013-02-15T13:07:02.810 回答