【问题标题】:Stored procedure using Dynamic SQL to create new table in Oracle存储过程使用动态 SQL 在 Oracle 中创建新表
【发布时间】:2021-10-17 04:10:36
【问题描述】:

问题如下:创建一个存储过程(NEW_TABLE),两个字符串作为输入参数:

  • 字符串 1:要生成的表的名称
  • 字符串 2:列名及其数据类型。

例如:'ID Number, ProductName varchar2(50), Quantity'

我实现了以下代码:

CREATE OR REPLACE PROCEDURE GENERATE_NEW_TABLE
    (TEMP_PRODS varchar2, COLUMNS_DATATYPES varchar2)
is
begin
    EXECUTE IMMEDIATE
    'CREATE TABLE '||TEMP_PRODS||'('||COLUMNS_DATATYPES||')';
end;

我这样称呼它:

EXEC GENERATE_NEW_TABLE('PRODUCTS','ID Number, PRODUCT_NAME VARCAR2(50), QUANTITY')

程序创建时没有编译错误,但是当我执行此程序时出现错误

缺少右括号

请分享我该如何解决这个问题。我只需要将两个字符串作为过程的输入参数。

【问题讨论】:

  • 在您展示失败调用的实际参数值是什么之前,我们不会回答这个问题
  • 您的列QUANTITY 没有数据类型
  • 我添加的数据类型还是一样的错误。
  • 您的VARCAR2 声明不正确。我可以摆弄它就好了
  • 虽然这个明显的家庭作业可能会教一些小知识,但我确实希望课程认为这是创建表格的好方法。作为业务需求,它是残酷的。使用动态 SQL 在数据库中创建对象的理由非常非常非常罕见。

标签: oracle stored-procedures plsql dynamic-sql


【解决方案1】:

使用动态 SQL 时,始终显示您将要执行的内容(使用 dbms_output.put_line)。只有没问题,才执行(立即)它。

SQL> CREATE OR REPLACE PROCEDURE GENERATE_NEW_TABLE
  2      (TEMP_PRODS varchar2, COLUMNS_DATATYPES varchar2)
  3  is
  4    l_str varchar2(200);
  5  begin
  6    l_str :=
  7      'CREATE TABLE '||TEMP_PRODS||'('||COLUMNS_DATATYPES||')';
  8    dbms_output.put_line(l_str);
  9    --execute immediate l_str;     --> don't run it until you make sure L_STR is correct
 10  end;
 11  /

Procedure created.

测试:

SQL> set serveroutput on
SQL> EXEC GENERATE_NEW_TABLE('PRODUCTS','ID Number, PRODUCT_NAME VARCAR2(50), QUANTITY')
CREATE TABLE PRODUCTS(ID Number, PRODUCT_NAME VARCAR2(50), QUANTITY)    --> this will be executed

PL/SQL procedure successfully completed.

SQL>

你要执行的语句是

CREATE TABLE PRODUCTS(ID Number, PRODUCT_NAME VARCAR2(50), QUANTITY)
                                              -------              ---
                                              typo             missing datatype

你觉得还可以吗?对我(以及其他人)来说不是。

固定后:

SQL> EXEC GENERATE_NEW_TABLE('PRODUCTS','ID Number, PRODUCT_NAME VARCHAR2(50), QUANTITY NUMBER')
CREATE TABLE PRODUCTS(ID Number, PRODUCT_NAME VARCHAR2(50), QUANTITY NUMBER)

PL/SQL procedure successfully completed.

SQL>

CREATE TABLE 现在看起来还好吗?是的,它确实。所以从程序中取消注释EXECUTE IMMEDIATE 并重复所有内容:

SQL> CREATE OR REPLACE PROCEDURE GENERATE_NEW_TABLE
  2      (TEMP_PRODS varchar2, COLUMNS_DATATYPES varchar2)
  3  is
  4    l_str varchar2(200);
  5  begin
  6    l_str :=
  7      'CREATE TABLE '||TEMP_PRODS||'('||COLUMNS_DATATYPES||')';
  8    dbms_output.put_line(l_str);
  9    execute immediate l_str;
 10  end;
 11  /

Procedure created.

SQL> EXEC GENERATE_NEW_TABLE('PRODUCTS','ID Number, PRODUCT_NAME VARCHAR2(50), QUANTITY NUMBER')
CREATE TABLE PRODUCTS(ID Number, PRODUCT_NAME VARCHAR2(50), QUANTITY NUMBER)

PL/SQL procedure successfully completed.

SQL> DESC PRODUCTS
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ----------------------------------
 ID                                                             NUMBER
 PRODUCT_NAME                                                   VARCHAR2(50)
 QUANTITY                                                       NUMBER

SQL>

现在已创建表。

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多