我对那个PLS-00103有问题,因为我完全不知道该怎么办...看起来很简单,仍然有问题...
我第一次使用PLS-00103“ CREATE”单词时遇到问题,当我将“ /”放在第三行时,我遇到了PLS-00103“ /”的问题。我在做什么错了?
create or replace package Sappe as
Procedure initialize;
end;
/
create or replace package body Sappe as
Procedure initialize is
begin
Drop table AAA;
CREATE TABLE AAA(id int not null,
x1 varchar(1) default ' ',
x2 varchar(1) default ' ',
x3 varchar(1) default ' ',
x4 varchar(1) default ' ',
x5 varchar(1) default ' ',
x6 varchar(1) default ' ',
x7 varchar(1) default ' ');
end initialize;
end sappe;
/
答案 0 :(得分:4)
我们无法在PL / SQL中执行本机DDL。您将必须使用动态SQL:
react-native init ptojectName
如果您还没有表create or replace package body Sappe as
Procedure initialize is
begin
execute immediate 'Drop table AAA';
execute immediate
q'[CREATE TABLE AAA(id int not null,
x1 varchar(1) default ' ',
x2 varchar(1) default ' ',
x3 varchar(1) default ' ',
x4 varchar(1) default ' ',
x5 varchar(1) default ' ',
x6 varchar(1) default ' ',
x7 varchar(1) default ' ')]';
end initialize;
end sappe;
/
,则第一步将失败。有多种解决方法(例如检查USER_TABLES),但是这种存储过程的基本前提基本上是有缺陷的。在一些高度专业化的用例之外,无需在PL / SQL中删除和创建表。在其他RDBMS产品比Oracle更熟悉的人中,这是一种常见的反模式。
答案 1 :(得分:2)
这是太多代码,无法注释,所以我在这里写。
首先,检查表是否存在:
SQL> DESC aaa;
ERROR:
ORA-04043: object aaa does not exist
现在,创建一个包及其主体-我包含了控件,如果表不存在,该控件将防止错误:
SQL> CREATE OR REPLACE PACKAGE Sappe
2 AS
3 PROCEDURE initialize;
4 END;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY Sappe
2 AS
3 PROCEDURE initialize
4 IS
5 l_cnt NUMBER;
6 BEGIN
7 SELECT COUNT (*)
8 INTO l_cnt
9 FROM user_tables
10 WHERE table_name = 'AAA';
11
12 IF l_cnt > 0
13 THEN
14 EXECUTE IMMEDIATE 'Drop table AAA';
15 END IF;
16
17 EXECUTE IMMEDIATE q'[CREATE TABLE AAA(id int not null,
18 x1 varchar(1) default ' ',
19 x2 varchar(1) default ' ',
20 x3 varchar(1) default ' ',
21 x4 varchar(1) default ' ',
22 x5 varchar(1) default ' ',
23 x6 varchar(1) default ' ',
24 x7 varchar(1) default ' ')]';
25 END initialize;
26 END sappe;
27 /
Package body created.
测试:
SQL> BEGIN
2 sappe.initialize;
3 END;
4 /
PL/SQL procedure successfully completed.
SQL>
SQL> DESC aaa;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(38)
X1 VARCHAR2(1)
X2 VARCHAR2(1)
X3 VARCHAR2(1)
X4 VARCHAR2(1)
X5 VARCHAR2(1)
X6 VARCHAR2(1)
X7 VARCHAR2(1)
SQL>
如您所见,它可以工作。现在表已存在,因此-让我们再次运行该过程-不应该失败:
SQL> BEGIN
2 sappe.initialize;
3 END;
4 /
PL/SQL procedure successfully completed.
SQL>
似乎还可以。