PL/SQL:创建序列时出错

ian*_*ank 5 oracle plsql pls-00103

我是新的PL/SQL,并且正在使用的Oracle SQL Developer写它使用序列来生成对已有数据的主键的过程中,写入到另一个数据库.

有问题的代码是在NDA下.基本上我有以下内容:

create or replace
PROCEDURE Generate_Data
(
   output IN VARCHAR2
) 
AS

-- Variables here --

CURSOR myCursor IS
SELECT data1, data2 
FROM table;

CREATE SEQUENCE mySequence      <-- error on this line
START WITH 0
INCREMENT BY 1;

BEGIN
LOOP
    -- snip --
Run Code Online (Sandbox Code Playgroud)

它引发错误PLS-00103,说它遇到以下时遇到符号CREATE:begin,function,package,pragma,procedure,...

我一直在关注这个例子:http: //www.techonthenet.com/oracle/sequences.php

Ben*_*Ben 7

您收到此错误的原因是您尝试执行DDL,在这种情况下,在PL/SQL中创建序列.可以这样做,但你必须使用execute immediate.

正如亚历克斯所说,你也无法在本declare节中做到这一点.它看起来像这样:

begin

   execute immediate 'CREATE SEQUENCE mySequence
                          START WITH 0
                          INCREMENT BY 1';    
end;
Run Code Online (Sandbox Code Playgroud)

但是,正如Padmarag所说,你不太可能想在PL/SQL中做到这一点.在外部创建一个序列然后再引用它会更常见.更一般地说,在PL/SQL块中执行DDL是一个坏主意; 你不应该这样做.

您没有提到您正在使用的Oracle版本.从11g开始,您可以访问序列的方式得到扩展.如果您使用的是11g,则可以通过创建变量并将序列中的下一个值分配.nextval给此变量来访问序列:

declare    
   l_seq number;    
begin

   loop
      -- For each loop l_seq will be incremented.
      l_seq := mysequence.nextval;
   -- snip    
end;
Run Code Online (Sandbox Code Playgroud)

如果你在11g之前,你必须(在DML之外)使用select语句来获得下一个值:

declare
   l_seq number;
begin

   loop
      -- For each loop l_seq will be incremented.
      select mysequence.nextval into l_seq from dual;
   -- snip    
end;
Run Code Online (Sandbox Code Playgroud)

请记住,序列是数据库中的持久对象.每次要使用它时都无需删除并重新创建它.如果您要运行脚本,然后重新运行它,序列将很乐意继续增加返回值.

进一步阅读