2016-09-23 33 views
0

我已創建了下面簡單的代碼,它將動態獲取表名,並創建一個表作爲每收到錯誤輸入表動態SQL錯誤ORA-00911

CREATE OR REPLACE 
PROCEDURE dyn_sql_sp(
    p_user  VARCHAR2, 
    p_table_name VARCHAR2, 
    P_NW_tbl_name VARCHAR2) 
AS 
    d_cols VARCHAR2(2000); 
    CURSOR col_c 
    IS 
    SELECT column_name 
     ||' ' 
     ||data_type 
     ||'(' 
     ||data_length 
     ||')' colm 
    FROM All_Tab_Columns 
    WHERE owner =UPPER(p_user) 
    AND table_name=UPPER(p_table_name); 
BEGIN 
    FOR i IN col_c 
    LOOP 
    d_cols:=d_cols||i.colm||','; 
    END LOOP; 
    D_Cols:=RTRIM(REPLACE(D_Cols,'DATE(7)','DATE'),','); 
    dbms_output.put_line('CREATE TABLE '||P_Nw_Tbl_Name||' ('||d_cols||');'); 
    EXECUTE Immediate ' CREATE TABLE '||P_Nw_Tbl_Name||' ('||d_cols||'); '; 
EXCEPTION 
WHEN OTHERS THEN 
    dbms_output.put_line(sqlerrm||SQLCODE); 
END; 

給出的列,但IM作爲

SQL> exec dyn_sql_sp('hr','departments','tamil'); 
CREATE TABLE tamil (DEPARTMENT_ID NUMBER(22),DEPARTMENT_NAME 
VARCHAR2(30),MANAGER_ID NUMBER(22),LOCATION_ID NUMBER(22) 
); 
ORA-00911: invalid character 

PL/SQL procedure successfully completed. 

希望節目是完全正確的,我可以單獨運行的輸出,並能正常工作,但得到錯誤,而我動態創建相同

SQL> CREATE TABLE tamil (DEPARTMENT_ID NUMBER(22),DEPARTMENT_NAME 
    2 VARCHAR2(30),MANAGER_ID NUMBER(22),LOCATION_ID NUMBER(22)); 

Table created. 

回答

4

問題可能在最後';'在動態聲明中:

SQL> begin 
    2  execute immediate 'create table tab_one(a number);'; 
    3 end; 
    4/
begin 
* 
ERROR at line 1: 
ORA-00911: invalid character 
ORA-06512: at line 2 


SQL> begin 
    2  execute immediate 'create table tab_one(a number)'; 
    3 end; 
    4/

PL/SQL procedure successfully completed. 
+0

ohh非常感謝你 –

+0

SQL語言沒有分號。它看起來好像它的確如此,因爲客戶端工具通常將它們用於命令終止符。 –