如何使用动态用户输入在 plsql 中使用 function/procedure 创建 table
How to create a table using a function/procedure in plsql using dynamic user input
如何在 plsql 中使用 function/procedure 创建 table 以便它应该将 table 名称作为动态变量并使用提供的参数创建 table?
A)我试过这个:
CREATE OR REPLACE PROCEDURE CREATE_TABLE IS
UN VARCHAR2(20) :=&TABLE_NAME;
BEGIN
CREATE TABLE UN(CUSTOMER_ID NUMBER,ORDER_DATE VARCHAR2(20),ORDER_MODE VARCHAR2(20),ORDER_STATUS NUMBER,SALES_REP_ID NUMBER,ORDER_TOTAL NUMBER,
PROMOTION_ID CHAR,ERROR_MESSAGE VARCHAR2(30),RECORD_STATUS CHAR);
end;
insert into UN(select distinct CUSTOMER_ID,TO_CHAR(TO_TIMESTAMP(ORDER_DATE),'DD-MM-YYYY'),UPPER(ORDER_MODE),UPPER(ORDER_STATUS),SALES_REP_ID,ORDER_TOTAL,PROMOTION_ID,ERROR_MESSAGE,RECORD_STATUS
FROM LIKHITH where ORDER_TOTAL >0 AND ORDER_TOTAL NOT LIKE '%.%');
IF COUNT(CUSTOMER_ID)=9 THEN
(
UPDATE LIKHITH SET (RECORD_STATUS='E' AND ERROR_MESSAGE='ERR') WHERE (ORDER_TOTAL<0 OR ORDER_TOTAL NOT LIKE '%.%');
UPDATE LIKHITH SET RECORD_STATUS='P' WHERE (ORDER_TOTAL<0 AND ORDER_TOTAL NOT LIKE '%.%');
UPDATE UN SET RECORD_STATUS='P';
)
END IF;
)
END;
/
您需要使用动态 SQL。您的代码中有许多不需要的多余括号。
另外这一行IF COUNT(CUSTOMER_ID)=9
没有意义。您应该从 table 做一个 select 并进行比较。
CREATE OR REPLACE PROCEDURE CREATE_TABLE
( un VARCHAR2)
IS
v_count NUMBER;
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE '||
UN ||
'
(
CUSTOMER_ID NUMBER,
ORDER_DATE VARCHAR2(20),
ORDER_MODE VARCHAR2(20),
ORDER_STATUS NUMBER,
SALES_REP_ID NUMBER,
ORDER_TOTAL NUMBER,
PROMOTION_ID CHAR,
ERROR_MESSAGE VARCHAR2(30),
RECORD_STATUS CHAR
)';
EXECUTE IMMEDIATE 'insert into '||
UN ||
'
select distinct
CUSTOMER_ID,
TO_CHAR(TO_TIMESTAMP(ORDER_DATE),''DD-MM-YYYY''),
UPPER(ORDER_MODE),
UPPER(ORDER_STATUS),
SALES_REP_ID,
ORDER_TOTAL,
PROMOTION_ID,
ERROR_MESSAGE,
RECORD_STATUS
FROM
LIKHITH
where ORDER_TOTAL >0
AND ORDER_TOTAL NOT LIKE ''%.%''' ;
EXECUTE IMMEDIATE 'SELECT COUNT(CUSTOMER_ID) FROM ' ||
UN INTO v_count;
IF v_count = 9 THEN
UPDATE
LIKHITH
SET RECORD_STATUS ='E' ,
ERROR_MESSAGE ='ERR'
WHERE ORDER_TOTAL <0
OR ORDER_TOTAL NOT LIKE '%.%';
ELSE
UPDATE
LIKHITH
SET RECORD_STATUS ='P'
WHERE ORDER_TOTAL <0
AND ORDER_TOTAL NOT LIKE '%.%';
EXECUTE IMMEDIATE 'UPDATE '||
UN ||
' SET RECORD_STATUS=''P''';
END IF;
END;
/
不要在编译期间传递 table 名称,因为在执行期间 trying.Pass 名称如下。
EXEC CREATE_TABLE('&table_name');
如何在 plsql 中使用 function/procedure 创建 table 以便它应该将 table 名称作为动态变量并使用提供的参数创建 table? A)我试过这个:
CREATE OR REPLACE PROCEDURE CREATE_TABLE IS
UN VARCHAR2(20) :=&TABLE_NAME;
BEGIN
CREATE TABLE UN(CUSTOMER_ID NUMBER,ORDER_DATE VARCHAR2(20),ORDER_MODE VARCHAR2(20),ORDER_STATUS NUMBER,SALES_REP_ID NUMBER,ORDER_TOTAL NUMBER,
PROMOTION_ID CHAR,ERROR_MESSAGE VARCHAR2(30),RECORD_STATUS CHAR);
end;
insert into UN(select distinct CUSTOMER_ID,TO_CHAR(TO_TIMESTAMP(ORDER_DATE),'DD-MM-YYYY'),UPPER(ORDER_MODE),UPPER(ORDER_STATUS),SALES_REP_ID,ORDER_TOTAL,PROMOTION_ID,ERROR_MESSAGE,RECORD_STATUS
FROM LIKHITH where ORDER_TOTAL >0 AND ORDER_TOTAL NOT LIKE '%.%');
IF COUNT(CUSTOMER_ID)=9 THEN
(
UPDATE LIKHITH SET (RECORD_STATUS='E' AND ERROR_MESSAGE='ERR') WHERE (ORDER_TOTAL<0 OR ORDER_TOTAL NOT LIKE '%.%');
UPDATE LIKHITH SET RECORD_STATUS='P' WHERE (ORDER_TOTAL<0 AND ORDER_TOTAL NOT LIKE '%.%');
UPDATE UN SET RECORD_STATUS='P';
)
END IF;
)
END;
/
您需要使用动态 SQL。您的代码中有许多不需要的多余括号。
另外这一行IF COUNT(CUSTOMER_ID)=9
没有意义。您应该从 table 做一个 select 并进行比较。
CREATE OR REPLACE PROCEDURE CREATE_TABLE
( un VARCHAR2)
IS
v_count NUMBER;
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE '||
UN ||
'
(
CUSTOMER_ID NUMBER,
ORDER_DATE VARCHAR2(20),
ORDER_MODE VARCHAR2(20),
ORDER_STATUS NUMBER,
SALES_REP_ID NUMBER,
ORDER_TOTAL NUMBER,
PROMOTION_ID CHAR,
ERROR_MESSAGE VARCHAR2(30),
RECORD_STATUS CHAR
)';
EXECUTE IMMEDIATE 'insert into '||
UN ||
'
select distinct
CUSTOMER_ID,
TO_CHAR(TO_TIMESTAMP(ORDER_DATE),''DD-MM-YYYY''),
UPPER(ORDER_MODE),
UPPER(ORDER_STATUS),
SALES_REP_ID,
ORDER_TOTAL,
PROMOTION_ID,
ERROR_MESSAGE,
RECORD_STATUS
FROM
LIKHITH
where ORDER_TOTAL >0
AND ORDER_TOTAL NOT LIKE ''%.%''' ;
EXECUTE IMMEDIATE 'SELECT COUNT(CUSTOMER_ID) FROM ' ||
UN INTO v_count;
IF v_count = 9 THEN
UPDATE
LIKHITH
SET RECORD_STATUS ='E' ,
ERROR_MESSAGE ='ERR'
WHERE ORDER_TOTAL <0
OR ORDER_TOTAL NOT LIKE '%.%';
ELSE
UPDATE
LIKHITH
SET RECORD_STATUS ='P'
WHERE ORDER_TOTAL <0
AND ORDER_TOTAL NOT LIKE '%.%';
EXECUTE IMMEDIATE 'UPDATE '||
UN ||
' SET RECORD_STATUS=''P''';
END IF;
END;
/
不要在编译期间传递 table 名称,因为在执行期间 trying.Pass 名称如下。
EXEC CREATE_TABLE('&table_name');