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
您收到此错误的原因是您尝试执行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)
请记住,序列是数据库中的持久对象.每次要使用它时都无需删除并重新创建它.如果您要运行脚本,然后重新运行它,序列将很乐意继续增加返回值.
| 归档时间: |
|
| 查看次数: |
8110 次 |
| 最近记录: |