PLS- 00103遇到符号“ /”和“创建”

时间:2018-09-25 14:59:19

标签: sql oracle plsql

我对那个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;
/

2 个答案:

答案 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>

似乎还可以。