0

Я знаю, что не рекомендуется создавать таблицу с помощью команды немедленного выполнения, но мне нужно создать таблицу, которая запрашивает у пользователя две части информации до начала действия. В настоящее время у меня есть:Создание таблицы со значением по умолчанию в операторе немедленного выполнения

DECLARE 
TEST_NAME VARCHAR2(200); 
TEST_VERSION VARCHAR2(200); 
BEGIN 
    TEST_NAME := '&1'; 
    TEST_VERSION := '&2'; 

EXECUTE IMMEDIATE 'create table TEST_TABLE 
(
PROJ_NAME VARCHAR(255) DEFAULT TEST_NAME, 
PROJ_VER VARCHAR(255) DEFAULT TEST_VERSION, 
COL_1 NUMBER(5) 
)'; 
End; 

Это бросает ошибку

Error report: 
ORA-00984: column not allowed here 
ORA-06512: at line 8 
00984. 00000 - "column not allowed here" 
*Cause:  
*Action: 

Как я могу решить эту проблему? Также как второй вопрос, если мне удастся создать эту таблицу в другом скрипте, как использовать оператор if для сравнения переменной со значением по умолчанию столбца proj_name (test_name)?

EDIT: Благодаря TBone и Parado я решил мой первый вопрос, хотя, если кто-то может помочь с знать, как использовать, если заявление, чтобы сделать что-то вроде этого:

If test_var = proj_name.default_value ... 

Мне нужно, чтобы быть в состоянии для сравнения с значением proj_name по умолчанию, даже если никакие строки не были вставлены. Спасибо,

ответ

1

Попробуйте так:

DECLARE 
TEST_NAME VARCHAR2(200); 
TEST_VERSION VARCHAR2(200); 
BEGIN 
    TEST_NAME := '&1'; 
    TEST_VERSION := '&2'; 

EXECUTE IMMEDIATE 'create table TEST_TABLE 
(
PROJ_NAME VARCHAR(255) DEFAULT '''||TEST_NAME||''', 
PROJ_VER VARCHAR(255) DEFAULT '''||TEST_VERSION||''', 
COL_1 NUMBER(5) 
)'; 
End; 
+0

Спасибо! : D работал отлично. – javakid1993

+0

Должен ли я принять ответ и задать другой вопрос для моего второго вопроса в редакторе? – javakid1993

+0

@ javakid1993 Думаю, вам нужно. – Parado

0

Вы можете сделать что-то вроде этого:

set serveroutput on 

declare 
    l_var1 varchar2(100) := 'SOME_VALUE'; 
    l_sql varchar2(4000); 
begin 
    l_sql := 'create table test_tab(
    col1 varchar2(100) default ''' || l_var1 || ''' 
)'; 

    -- show the ddl used 
    dbms_output.put_line(l_sql); 

    -- create the table 
    execute immediate l_sql; 

end; 

Здесь я жестко прописывать l_var1 к 'some_value', но вы можете использовать тот же подход, с параметром или переменной пользователя.

+0

Спасибо! : D работал отлично. – javakid1993

+0

@ javakid1993 приятно слышать, если это сработало для вас, вы можете принять этот ответ (отметьте его). – tbone