2016-10-27 7 views
1

ich folgende Vorgehensweise verwenden in pl sqlVariable innerhalb ausführen sofort

CREATE OR REPLACE "MY_PROCEDURE" (v_id number, v_name varchar2) AS 
    BEGIN 
     EXECUTE IMMEDIATE ' CREATE TABLE T_TEMPO (t_id number , t_name varchar2(250) , t_value number)'; 
     EXECUTE IMMEDIATE 'INSERT INTO T_TEMPO (t_id , t_name, t_value) 
          SELECT id , name , value 
          from TABLE_2 
          where TABLE_2.id = || v_id || 
          AND TABLE_2.name = || v_name || '; 

Aber dies nicht funktioniert, ich habe einen fehlenden Ausdruck Fehler, frage ich mich, es kann der Wert der Variablen nicht bewerten v_id und v_name innerhalb der Ausführung sofort. Kann mir bitte jemand helfen?

Antwort

0

Bitte verwenden Sie Variablen außerhalb Zitat:

EXECUTE IMMEDIATE ' CREATE TABLE T_TEMPO (t_id number , t_name varchar2(250) , t_value number)'; 
    EXECUTE IMMEDIATE 'INSERT INTO T_TEMPO (t_id , t_name, t_value) 
         SELECT id , name , value 
         from TABLE_2 
         where TABLE_2.id = ' || v_id || 
         ' AND TABLE_2.name = '''|| v_name || ''''; 
+0

'|| v_name || ; 'wird scheitern –

+0

@WernfriedDomscheit ja du hast recht ich habe zitate verpasst – Kacper

3

müssen Sie entweder die Werte zitieren (Anführungszeichen soweit erforderlich):

create or replace procedure my_procedure 
    (v_id number 
    , v_name varchar2) 
as 
begin 
    execute immediate 'CREATE TABLE T_TEMPO (t_id number, t_name varchar2(250), t_value number)'; 
    execute immediate 'INSERT INTO T_TEMPO (t_id, t_name, t_value) 
         SELECT id, name, value 
         FROM table_2 
         WHERE table_2.id = ' || v_id || 
        ' AND table_2.name = ''' || v_name || ''''; 
end my_procedure; 

oder (in der Regel besser) geben sie als bind Variablen:

create or replace procedure my_procedure 
    (v_id number 
    , v_name varchar2) 
as 
begin 
    execute immediate 'CREATE TABLE T_TEMPO (t_id number, t_name varchar2(250), t_value number)'; 
    execute immediate 'INSERT INTO T_TEMPO (t_id, t_name, t_value) 
         SELECT id, name, value 
         FROM table_2 
         WHERE table_2.id = :id 
         AND table_2.name = :name' using v_id, v_name; 
end my_procedure; 

btw würde ich das v Präfix für Variablen verwenden und für Parameter.

Verwandte Themen