2017-11-18 13 views
0

関数/プロシージャをplsqlで使用してテーブルを作成し、テーブル名を動的変数として取得し、動的ユーザ入力を使用する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を使用する必要があります。 A)私はこれを試してみました。あなたのコードには不要な括弧がたくさんありました。

また、この行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

ありがとう...答えは... –

関連する問題