使用动态 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>
现在已创建表。