2016-09-23 2 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; 

ввода, но им получать сообщение об ошибке, как

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 не имеет точки с запятой. Это выглядит так, как будто это происходит потому, что клиентские инструменты обычно используют их для терминатора команд. –

Смежные вопросы