Oracle PLS-00103在程序内创建表格时出现编译错误
我正在编写一些为数据库创建表的PL/SQL代码 当我试图追踪代码时,我不断收到错误PLS-00103。我看过其他线程,它表明缺少循环的开始,但我看不到它可能在哪里 设置服务器输出 执行本条例Oracle PLS-00103在程序内创建表格时出现编译错误,oracle,plsql,Oracle,Plsql,我正在编写一些为数据库创建表的PL/SQL代码 当我试图追踪代码时,我不断收到错误PLS-00103。我看过其他线程,它表明缺少循环的开始,但我看不到它可能在哪里 设置服务器输出 执行本条例 CREATE OR REPLACE PROCEDURE THELLO AS WELCOME VARCHAR(50); BEGIN CREATE TABLE NEW_PART( P_PARTKEY NUMBER(12) NOT NULL, P_NAME VARCHAR(55)
CREATE OR REPLACE PROCEDURE THELLO AS
WELCOME VARCHAR(50);
BEGIN
CREATE TABLE NEW_PART(
P_PARTKEY NUMBER(12) NOT NULL,
P_NAME VARCHAR(55) NOT NULL,
P_MFGR VARCHAR(25) NOT NULL,
P_BRAND CHAR(10) NOT NULL,
P_TYPE VARCHAR(25) NOT NULL,
P_SIZE NUMBER(12) NOT NULL,
P_CONTAINER CHAR(10) NOT NULL,
P_RETAILPRICE NUMBER(12,2) NOT NULL,
P_COMMENT VARCHAR(23) NOT NULL,
CONSTRAINT NEW_PART_PEKEY PRIMARY KEY (P_PARTKEY),
CONSTRAINT NEW_PART_CHECK1 CHECK(P_PARTKEY >= 0),
CONSTRAINT NEW_PART_CHECK2 CHECK(P_SIZE >= 0),
CONSTRAINT NEW_PART_CHECK3 CHECK(P_RETAILPRICE >= 0) );
CREATE TABLE NEW_SUPPLIER(
S_SUPPKEY NUMBER(12) NOT NULL,
S_NAME CHAR(25) NOT NULL,
S_ADDRESS VARCHAR(40) NOT NULL,
S_NATIONKEY NUMBER(12) NOT NULL,
S_PHONE CHAR(15) NOT NULL,
S_ACCTBAL NUMBER(12,2) NOT NULL,
S_COMMENT VARCHAR(101) NOT NULL,
CONSTRAINT NEW_SUPPLIER_PKEY PRIMARY KEY (S_SUPPKEY),
CONSTRAINT NEW_SUPPLIER_FKEY1 FOREIGN KEY (S_NATIONKEY)
REFERENCES NATION(N_NATIONKEY),
CONSTRAINT NEW_SUPPLIER_CHECK1 CHECK(S_SUPPKEY >= 0) );
CREATE TABLE NEW_PARTSUPP(
PS_PARTKEY NUMBER(12) NOT NULL,
PS_SUPPKEY NUMBER(12) NOT NULL,
PS_AVAILQTY NUMBER(12) NOT NULL,
PS_SUPPLYCOST NUMBER(12,2) NOT NULL,
PS_COMMENT VARCHAR(199) NOT NULL,
CONSTRAINT NEW_PARTSUPP_PKEY PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY),
CONSTRAINT NEW_PARTSUPP_FKEY1 FOREIGN KEY (PS_PARTKEY)
REFERENCES NEW_PART(P_PARTKEY),
CONSTRAINT NEW_PARTSUPP_FKEY2 FOREIGN KEY (PS_SUPPKEY)
REFERENCES NEW_SUPPLIER(S_SUPPKEY),
CONSTRAINT NEW_PARTSUPP_CHECK1 CHECK(PS_PARTKEY >= 0),
CONSTRAINT NEW_PARTSUPP_CHECK2 CHECK(PS_AVAILQTY >= 0),
CONSTRAINT NEW_PARTSUPP_CHECK3 CHECK(PS_SUPPLYCOST >= 0) );
DECLARE
BEGIN
FOR PARTKEY IN (SELECT DISTINCT PS_PARTKEY FROM PARTSUPP)
LOOP
INSERT INTO NEW_PART ( SELECT *
FROM PART
WHERE P_PARTKEY = PARTKEY.PS_PARTKEY );
COMMIT;
END LOOP;
FOR SUPPKEY IN (SELECT DISTINCT PS_SUPPKEY FROM PARTSUPP)
LOOP
INSERT INTO NEW_SUPPLIER ( SELECT *
FROM SUPPLIER
WHERE S_SUPPKEY = SUPPKEY.PS_SUPPKEY );
COMMIT;
END LOOP;
INSERT INTO NEW_PARTSUPP ( SELECT *
FROM PARTSUPP
WHERE PS_PARTKEY IN ( SELECT P_PARTKEY
FROM NEW_PART ) AND
PS_SUPPKEY IN ( SELECT S_SUPPKEY
FROM NEW_SUPPLIER ) );
COMMIT;
END THELLO;
/
show errors
prompt Done.
问题:
PLS-00103:在预期以下情况之一时遇到符号“CREATE”:(begin case declare end exception exit for goto if loop mod null pragma raise return select update with,如我所述,除非在
立即执行中使用,否则表创建不能作为过程的一部分
在创建过程之前单独创建表
CREATE TABLE NEW_PART(
P_PARTKEY NUMBER(12) NOT NULL,
P_NAME VARCHAR(55) NOT NULL,
P_MFGR VARCHAR(25) NOT NULL,
P_BRAND CHAR(10) NOT NULL,
P_TYPE VARCHAR(25) NOT NULL,
P_SIZE NUMBER(12) NOT NULL,
P_CONTAINER CHAR(10) NOT NULL,
P_RETAILPRICE NUMBER(12,2) NOT NULL,
P_COMMENT VARCHAR(23) NOT NULL,
CONSTRAINT NEW_PART_PEKEY PRIMARY KEY (P_PARTKEY),
CONSTRAINT NEW_PART_CHECK1 CHECK(P_PARTKEY >= 0),
CONSTRAINT NEW_PART_CHECK2 CHECK(P_SIZE >= 0),
CONSTRAINT NEW_PART_CHECK3 CHECK(P_RETAILPRICE >= 0) );
CREATE TABLE NEW_SUPPLIER(
S_SUPPKEY NUMBER(12) NOT NULL,
S_NAME CHAR(25) NOT NULL,
S_ADDRESS VARCHAR(40) NOT NULL,
S_NATIONKEY NUMBER(12) NOT NULL,
S_PHONE CHAR(15) NOT NULL,
S_ACCTBAL NUMBER(12,2) NOT NULL,
S_COMMENT VARCHAR(101) NOT NULL,
CONSTRAINT NEW_SUPPLIER_PKEY PRIMARY KEY (S_SUPPKEY),
CONSTRAINT NEW_SUPPLIER_FKEY1 FOREIGN KEY (S_NATIONKEY)
REFERENCES NATION(N_NATIONKEY),
CONSTRAINT NEW_SUPPLIER_CHECK1 CHECK(S_SUPPKEY >= 0) );
CREATE TABLE NEW_PARTSUPP(
PS_PARTKEY NUMBER(12) NOT NULL,
PS_SUPPKEY NUMBER(12) NOT NULL,
PS_AVAILQTY NUMBER(12) NOT NULL,
PS_SUPPLYCOST NUMBER(12,2) NOT NULL,
PS_COMMENT VARCHAR(199) NOT NULL,
CONSTRAINT NEW_PARTSUPP_PKEY PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY),
CONSTRAINT NEW_PARTSUPP_FKEY1 FOREIGN KEY (PS_PARTKEY)
REFERENCES NEW_PART(P_PARTKEY),
CONSTRAINT NEW_PARTSUPP_FKEY2 FOREIGN KEY (PS_SUPPKEY)
REFERENCES NEW_SUPPLIER(S_SUPPKEY),
CONSTRAINT NEW_PARTSUPP_CHECK1 CHECK(PS_PARTKEY >= 0),
CONSTRAINT NEW_PARTSUPP_CHECK2 CHECK(PS_AVAILQTY >= 0),
CONSTRAINT NEW_PARTSUPP_CHECK3 CHECK(PS_SUPPLYCOST >= 0) );
现在,你的程序代码
CREATE OR REPLACE PROCEDURE THELLO AS
WELCOME VARCHAR(50);
BEGIN
FOR PARTKEY IN (SELECT DISTINCT PS_PARTKEY FROM PARTSUPP)
LOOP
INSERT INTO NEW_PART ( SELECT *
FROM PART
WHERE P_PARTKEY = PARTKEY.PS_PARTKEY );
COMMIT;
END LOOP;
FOR SUPPKEY IN (SELECT DISTINCT PS_SUPPKEY FROM PARTSUPP)
LOOP
INSERT INTO NEW_SUPPLIER ( SELECT *
FROM SUPPLIER
WHERE S_SUPPKEY = SUPPKEY.PS_SUPPKEY );
COMMIT;
END LOOP;
INSERT INTO NEW_PARTSUPP ( SELECT *
FROM PARTSUPP
WHERE PS_PARTKEY IN ( SELECT P_PARTKEY
FROM NEW_PART ) AND
PS_SUPPKEY IN ( SELECT S_SUPPKEY
FROM NEW_SUPPLIER ) );
COMMIT;
END THELLO;
/
不能在过程内执行ddl,即不能在过程内执行create table。如果确实要在过程内执行任何ddl,请使用execute immediate
,并且declare
不能在begin..end
标记内正确使用。SQL Server和Oracle不使用相同的SQL方言并且具有不同的功能。此外,您应该用标准的varchar2
替换char
和varchar
。