2013-08-09 5 views
0

Я хотел бы, чтобы сформировать динамический оператор вставки с другим именем пользователя и данные из ROWTYPEInsert SQL Command с динамическим Псевдоним и rowtypes

мой сниппет

create or replace procedure test() 
is 
TYPE cv_typ is REF CURSOR; 
cv cv_typ; 
stmt varchar(2000); 
zieldb varchar(20); 

vKunden "Kunden"%rowtype; 

BEGIN 


execute immediate 'select * from "Kunden" where "KndNr"=55 ' into vKunden; 

stmt:='select kc.zieldb from test.kunden_copy kc, test.transrel vd 
where kc.zieldb=vd.dbname and kc.status=1 '; 

OPEN cv FOR stmt; 
LOOP 
    FETCH cv into nachdb; 
    EXIT WHEN cv%NOTFOUND; 
    ... 
    ... 
    stmt:='insert into ' || nachdb || ' ."Kunden" values ' || vKunden; 
    execute immediate stmt ;   
    ... 
    ... 
END LOOP; 
END; 

я получаю следующее сообщение об ошибке:

PLS-00306 неправильное число или типы аргументов в вызове

следующий синтаксис

stmt:='insert into ' || nachdb || ' ."Kunden" values vKunden '; 
execute immediate stmt ;   

я получаю следующее сообщение:

ORA-03001: нереализованный особенность

благодаря

ответ

1

Кажется, вы не можете сделать это. В первой попытке вы пытаетесь объединить тип записи PL/SQL (от %rowtype) на строку; если он позволит вам тогда, что бы он поставил, его внутреннее представление записи? Чтобы он был действительным вставкой, он должен был перевести его в список значений из записи, как (col1, col2, ...), который задает довольно много.

В вашей второй версии, с ORA-03001, я думаю, это потому, что она интерпретирует vKunden как идентификатор объекта; переменная записи в блоке PL/SQL не входит в область действия оператора SQL.

Предположительно, вы попытались использовать переменную привязки для этого и обнаружили, что вы не можете, поскольку переменные привязки должны быть типами SQL (PLS-00457).

Возможно, вы можете использовать DBMS_SQL для перехода через переменную %rowtype и создать свой собственный код values на основе столбцов/полей, которые он содержит, но это кажется болезненным.

Предположительно, хотя различные версии "Kunden" (идентификаторы объекта в кавычках? Не вы обнаружите, что очень болезненно работать?) Являются идентичными, в противном случае %rowtype вы используете, чтобы объявить vKunden не будет применяться для вставки в любом случае, и вы знаете все имена столбцов. Вы должны связать значение каждого столбца по отдельности:

stmt:='insert into ' || nachdb || ' ."Kunden" ("KndNr", "Col2", ...)' 
    || ' values (:1, :2, ...)'; 
execute immediate stmt using vKunden."KndNR", vKunden."Col2", ...; 

Хотя еще проще было бы:

stmt:='insert into ' || nachdb || ' ."Kunden"' 
    || ' select * from "Kunden" where "KndNr"=55'; 
execute immediate stmt; 

... который обходит vKunden%rowtype и проблемы в целом. Вы делаете это несколько раз, но это может быть не значительная сумма накладных расходов.

0

Просто чтобы добавить, почему это не сработает: 03001 - это потому, что у вас нет скобок() вокруг значений. Даже с помощью скобок это не сработает, потому что vKunden имеет% rowtype, поэтому вы не можете передать это в динамический sql (pls-00457). Вы можете проверить это, используя: выполнить немедленный «select: 1 from dual» с помощью vKunden;