Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 具有循环和立即执行的过程_Oracle_Pls 00103 - Fatal编程技术网

Oracle 具有循环和立即执行的过程

Oracle 具有循环和立即执行的过程,oracle,pls-00103,Oracle,Pls 00103,最近,我开始为常规报告过程准备数据集市,并尝试使用带有参数的过程 因此,我阅读并尝试复制,但在编译时被错误弄糊涂了 这是我的密码: 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

最近,我开始为常规报告过程准备数据集市,并尝试使用带有参数的过程

因此,我阅读并尝试复制,但在编译时被错误弄糊涂了

这是我的密码:

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
表示
@
符号出乎意料


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

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

首先,Oracle(除非您使用带引号的标识符,但请不要使用)和。。。那么这是相关的部分:

非引号标识符必须以中的字母字符开头 您的数据库字符集。带引号的标识符可以以任意字符开头 性格

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

带引号的标识符可以包含任何字符和标点符号 还有空间。但是,无论是带引号的标识符还是不带引号的标识符 可以包含双引号或空字符(\0)

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

编辑:看,我对SQL Server太不熟悉了,我误读了它在做什么。您的过程名称是确定的,但这不是您声明参数的方式;它应该开始:

create or replace procedure mig_rate(rep_date date) as
...
其次,不能在Oracle过程中创建(声明?)这样的表。看起来在整个过程中您需要一个临时表,但Oracle不是这样工作的;您可以在过程之外创建一个全局临时表,但它是一个永久的数据库对象—只有数据是临时的

你可以用a代替,但这取决于你想用它做什么。如果在插入到普通表之前它是一个暂存区域,那么您可能可以将其作为一个SQL命令来执行,这样性能会更好

我不知道为什么要在这里使用动态SQL(
executeimmediate


请参考和Oracle特定的站点,而不是SQL Server特定的站点,了解如何操作;它们的工作方式有很大差异。

Alex!非常感谢您的回答,我已经离开一段时间了。我将研究您的链接,然后可能会提出一些新问题!)我想使用execute-mmediate的原因是我引用的表有像x_1、x_2、x_3这样的列名。。。所以我想在“0..32循环中的t”中循环它们