2017-11-18 147 views
0

如何使用plsql中的函数/过程创建表,以便将表名称作为动态变量并使用提供的参数创建该表? A)我试过了:如何使用动态用户输入在plsql中使用函数/过程创建表

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; 
/
+0

即使PL/SQL具有'create table'(它没有),它也无法编译,因为表'UN'无法在编译时解析。然而,'&TABLE_NAME'将在编译时解析(假设这是由支持替换变量的应用程序运行的,并使用'&'字符表示),这可能不是您想要的。 –

回答

1

您需要使用动态SQL。代码中有许多冗余的括号,这是不需要的。

另外这条线IF COUNT(CUSTOMER_ID)=9没有意义。您应该从表格中进行选择并进行比较。

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; 
/

在编译过程中不要传递表名,因为您正在尝试。在执行过程中如下所示通过它。

EXEC CREATE_TABLE('&table_name'); 
+0

谢谢...对于答案... –

相关问题