im essayant de faire quelque chose comme ceci:paramètres dynamiques non types SQL Oracle
create function getData(r1 IN TABLE1%ROWTYPE,col1 string, valor OUT string)RETURN string AS
instruccion VARCHAR2(500);
valor VARCHAR(200);
BEGIN
valor := r1.col1;
return valor;
END getData;
Une procédure qui prend comme paramètres un enregistrement et le nom de la colonne et de redonner la valeur et:
CREATE procedure p1 as
vData VARCHAR2(80);
v1 VARCHAR2(80);
vValue VARCHAR2(80);
inst VARCHAR2(500);
CURSOR vTable2 IS SELECT * FROM TABLE2;
CURSOR vTable1 IS SELECT * FROM TABLE1;
BEGIN
--A cursor for the table with the data
FOR d1 IN vTable1
LOOP
--A cursor for the table that store the name of the columns of the table 1
FOR v1 IN vTable2
LOOP
--get the table1 column name
vData := v1.table2Col1;
--calls the procedure that gives back the value of that record on the column name is stored in VData
inst := 'begin getData(:d1, :vData, :vValue); end;';
EXECUTE IMMEDIATE inst USING in d1 , vData, OUT vValue;
DBMS_OUTPUT.PUT_LINE(vValue);
END LOOP;
END LOOP;
END p1;
donc, en résumé je veux juste avoir une table qui stocke les noms des table1 dans table2, parce que je veux la procédure de travailler avec une table avec le table1 nom, ce code me donne l'erreur « expression doivent être de SQL types "pour les paramètres du bloc dynamique et je le comprends, mais peut f igure une nouvelle façon de le faire. J'ai essayé beaucoup de choses mais je suis un peu nouveau dans Oracle et j'aurais vraiment apprécié l'aide.
Pourquoi utilisez-vous 'exécuter immediate'? Pourquoi n'appelez-vous pas simplement la fonction 'getData (d1, vData, vValue);'? – San
Pas besoin de SQL dynamique ici. Vois ma réponse. –
On ne sait pas ce que vous essayez d'atteindre, mais un coup d'oeil à [DBMS_SQL] (http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm). Mais dans de nombreux cas, vous n'avez pas besoin de SQL dynamique. –