最近我开始为定期报告流程准备数据集,并尝试使用带参数的程序。
所以我读了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 :(得分: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特定的站点来了解该做什么;他们的工作方式存在很大差异。