【问题标题】:Creating database table in PL/SQL procedure在 PL/SQL 过程中创建数据库表
【发布时间】:2021-05-30 03:59:52
【问题描述】:

我正在尝试使用过程CREATE_TABLE 创建表,然后使用过程PRINT_INFO 将信息插入到创建的表中,但出现异常:

错误:PROCEDURE PRINT_INFO 行/列:4/3 PL/SQL:SQL 语句 忽略行/列:4/15 PL/SQL:ORA-00942:表或视图不存在

错误:PROCEDURE CREATE_TABLE 行/列:5/3 PLS-00103:遇到 预期以下之一时的符号“CREATE”:

( begin case declare exit for goto if loop mod null pragma raise 在

这是我的代码示例:

CREATE OR REPLACE PROCEDURE PRINT_INFO
IS
BEGIN
  INSERT INTO TABLE_T (TABLE_ID, MESSAGE) VALUES (1, 'Hello World!');
END PRINT_INFO;
/

CREATE OR REPLACE PROCEDURE CREATE_TABLE
IS
BEGIN

  CREATE TABLE TABLE_T(
    TABLE_ID NUMBER NOT NULL,
    MESSAGE VARCHAR2(25), 
    PRIMARY KEY(TABLE_ID)
  );
  
  PRINT_INFO;
  
END CREATE_TABLE;
/

EXEC CREATE_TABLE;

问题可能出在哪里?如何摆脱异常?

【问题讨论】:

  • @Littlefoot 为您提供了错误的技术原因。我会更进一步,并建议没有理由编写 PL/SQL 过程来创建表。表创建应该是可以/应该使用直接 sql 完成的一次性活动。这是一个班级项目吗?我可以发誓在过去的几天里我也看到过同样的问题。

标签: sql oracle plsql


【解决方案1】:

您必须声明一个字符串并将您的 ddl 分配给该变量,然后使用 execute immediate your_variable;

【讨论】:

  • 不,你没有来声明一个字符串并将你的ddl分配给它。您可以轻松地“立即执行 'select my_col from my_table' ;”也就是说,我更喜欢将它分配给一个变量,这样我也可以在 dbms_output.put_line 中引用它进行调试。
  • 我会比@EdStevens 更进一步。将实际语句放在变量中允许我记录实际语句是异常的情况。但这不应该出现在程序中。
  • @Belayer - “但这不应该在程序中”。正确 - 用于生产代码。但我确实说过“用于调试”。我们在调试代码中放入了很多东西,我们在调试完成并准备投入生产时取出。
  • @EdStevens - 是的。我也。但是将语句放入变量中的这一点对于比调试更有用
【解决方案2】:

这两个过程都必须使用动态 SQL:

  • print_info 因为它插入到一个表中——在编译时——还不存在
  • create_table 因为它运行 DDL 并且 - 为了做到这一点 - 您需要使用动态 SQL

因此:

SQL> CREATE OR REPLACE PROCEDURE PRINT_INFO
  2  IS
  3  BEGIN
  4    execute immediate q'[INSERT INTO TABLE_T (TABLE_ID, MESSAGE) VALUES (1, 'Hello World!')]';
  5  END PRINT_INFO;
  6  /

Procedure created.

SQL> CREATE OR REPLACE PROCEDURE CREATE_TABLE
  2  IS
  3  BEGIN
  4    execute immediate 'CREATE TABLE TABLE_T(' ||
  5      'TABLE_ID NUMBER NOT NULL, ' ||
  6      ' MESSAGE VARCHAR2(25), '    ||
  7      ' PRIMARY KEY(TABLE_ID) '    ||
  8      ')';
  9
 10    PRINT_INFO;
 11  END CREATE_TABLE;
 12  /

Procedure created.

SQL> EXEC CREATE_TABLE;

PL/SQL procedure successfully completed.

SQL> SELECT * FROM table_t;

  TABLE_ID MESSAGE
---------- -------------------------
         1 Hello World!

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 2017-01-20
    • 2012-03-24
    • 2017-12-21
    • 1970-01-01
    • 2022-08-17
    • 2016-07-30
    相关资源
    最近更新 更多