Exécuter une chaîne de caractère en PL/SQL - SQL/NoSQL - Programmation
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 )
Code :
|
Marsh Posté le 19-10-2005 à 20:30:07
C'est que tu n'as pas fait la même chose
(et puis c'est quoi ce champ varchar pour stoquer une date ? )
(et les SELECT FROM dual dans du PL/SQL, c'est pas utile ... autant faire une assignation [ := ] )
Marsh Posté le 19-10-2005 à 23:08:39
les assignations plantent, j'y peux rien
sinon, c'est un varchar, parceque c'est comme ça dans l'ERP sur lequel je bosse
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...)
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 ???