Exécuter une chaîne de caractère en PL/SQL

Exécuter une chaîne de caractère en PL/SQL - SQL/NoSQL - Programmation

Marsh Posté le 19-10-2005 à 18:14:20    

Sous Oracle.
 
Dans une boucle sur une liste de tables, j'ai besoin de faire une requête sur chacune des tables.
J'ai que du PL/SQL sous la main.
 
J'ai trouvé ça sur le net (orafaq, donc une source normalement sérieuse...)
 

Citation :

Can one use dynamic SQL statements from PL/SQL?
Starting from Oracle8i one can use the "EXECUTE IMMEDIATE" statement to execute dynamic SQL and PL/SQL statements (statements created at run-time). Look at these examples. Note that statements are NOT terminated by semicolons:  
 EXECUTE IMMEDIATE 'CREATE TABLE x (a NUMBER)';
 
 -- Using bind variables...
 sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)';
 EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;
 
        -- Returning a cursor...
 sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
 EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;
 
One can also use the older DBMS_SQL package (V2.1 and above) to execute dynamic statements. Look at these examples:  
 CREATE OR REPLACE PROCEDURE DYNSQL AS
   cur integer;
   rc  integer;
 BEGIN
   cur := DBMS_SQL.OPEN_CURSOR;
   DBMS_SQL.PARSE(cur, 'CREATE TABLE X (Y DATE)', DBMS_SQL.NATIVE);
   rc := DBMS_SQL.EXECUTE(cur);
   DBMS_SQL.CLOSE_CURSOR(cur);
 END;
 /
 
More complex DBMS_SQL example using bind variables:  
 CREATE OR REPLACE PROCEDURE DEPARTMENTS(NO IN DEPT.DEPTNO%TYPE) AS
   v_cursor integer;
   v_dname  char(20);
   v_rows   integer;
 BEGIN
   v_cursor := DBMS_SQL.OPEN_CURSOR;
   DBMS_SQL.PARSE(v_cursor, 'select dname from dept where deptno > :x', DBMS_SQL.V7);
   DBMS_SQL.BIND_VARIABLE(v_cursor, ':x', no);
   DBMS_SQL.DEFINE_COLUMN_CHAR(v_cursor, 1, v_dname, 20);
   v_rows := DBMS_SQL.EXECUTE(v_cursor);
   loop
     if DBMS_SQL.FETCH_ROWS(v_cursor) = 0 then
        exit;
     end if;
     DBMS_SQL.COLUMN_VALUE_CHAR(v_cursor, 1, v_dname);
     DBMS_OUTPUT.PUT_LINE('Deptartment name: '||v_dname);
   end loop;
   DBMS_SQL.CLOSE_CURSOR(v_cursor);
 EXCEPTION
   when others then
        DBMS_SQL.CLOSE_CURSOR(v_cursor);
        raise_application_error(-20000, 'Unknown Exception Raised: '||sqlcode||' '||sqlerrm);
 END;
 /


 
sauf que chez moi, ça plante sur le EXECUTE IMMEDIATE si je ne met pas de "USING" comme quoi il manque un mot clé (j'en ai pas besoin). Et si je met un using pour faire joli, ben ça plante dessus en me disant qu'il attends un : / @ ou chais pas quoi.
 
Une idée ???

Reply

Marsh Posté le 19-10-2005 à 18:14:20   

Reply

Marsh Posté le 19-10-2005 à 18:59:33    

Comprends pas...
 
J'ai refait la même chose que tout à l'heure, et ce coup-ci ça marche !
 
(tant mieu vous me direz :D)
 

Code :
  1. declare
  2.   dte varchar2(8);
  3.   tblnme varchar2(255);
  4.   sqlcmd varchar2(4000);
  5. begin
  6.   select 'matable' into tblnme from dual;
  7.   select to_char(sysdate, 'YYYYMMDD') into dte from dual;
  8.   select 'update ' || tblnme || ' set datmod = :1' into sqlcmd from dual;
  9.   execute immediate (sqlcmd) using dte;
  10. end;

Reply

Marsh Posté le 19-10-2005 à 20:30:07    

C'est que tu n'as pas fait la même chose :p
 
(et puis c'est quoi ce champ varchar pour stoquer une date ? :D )
 
(et les SELECT FROM dual dans du PL/SQL, c'est pas utile ... autant faire une assignation [ := ] )


Message édité par Beegee le 19-10-2005 à 20:30:17
Reply

Marsh Posté le 19-10-2005 à 23:08:39    

les assignations plantent, j'y peux rien :spamafote:
 
sinon, c'est un varchar, parceque c'est comme ça dans l'ERP sur lequel je bosse

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed