J'ai eu un autre thread pour résoudre un problème différent et maintenant je suis coincé sur une autre erreur apparemment simple. Ma morue est la suivante:PL/SQL - Je continue d'obtenir cette erreur lors de la concaténation: PLS-00306: mauvais numéro ou types d'arguments dans l'appel à '||'
declare
update_count integer := 0;
prjt_name varchar2(100) not null := '01213264B';
cursor my_cur is (select table_name from [email protected]_pos15 where column_name = 'PROJECT_ID' and owner = 'SANDBOX');
tableName my_cur%rowtype;
begin
for tableName in my_cur
loop
update_count := 0;
Execute immediate
'select count(t.project_id) as "CNT" from sandbox.'
|| tableName
|| '@adhoc_pos15 t'
|| 'where t.project_id = (select project_id from [email protected]_pos15 where project_name = upper('
|| prjt_name
|| '))'
into update_count;
if update_count = 0 then
execute immediate
'DELETE FROM my_cur where table_name = '
|| tableName;
end if;
end loop;
end;
Mon message d'erreur est
ORA-06550: line 11, column 8:
PLS-00306: wrong number or types of arguments in call to '||'
ORA-06550: line 10, column 6:
PL/SQL: Statement ignored
ORA-06550: line 20, column 8:
PLS-00306: wrong number or types of arguments in call to '||'
ORA-06550: line 19, column 6:
PL/SQL: Statement ignored
Si vous êtes intéressé. Je vais passer un lien vers l'erreur précédente que je recevais ci-dessous. Vous pouvez voir à quoi ressemblait le code à l'origine.
Edit 1: Par les suggestions de Valli. Je l'ai mis à jour mon codage et obtenir l'erreur expression manquante à la ligne 15.
declare
query varchar2(10000);
update_count integer := 0;
prjt_name varchar2(100) := '01213264B';
cursor my_cur is (select table_name from [email protected] column_name = 'PROJECT_ID' and owner = 'SANDBOX');
tableName varchar2(100);
begin
open my_cur;
loop
fetch my_cur into tableName;
exit when my_cur%NOTFOUND;
update_count := 0;
execute immediate
'select count(project_id) as "CNT" from sandbox.' || tableName || '@db2 '
|| ' where project_id = (select project_id from [email protected] where project_name = ''' || prjt_name || ''') '
into update_count;
if update_count > 0 then
dbms_output.put_line (tableName);
end if;
end loop;
close my_cur;
end;
je manque un « = » symbole. Cela fonctionne maintenant. Je reçois quelques résultats que le message d'erreur
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04040: file ext_qsp_benefit.dat in DATA_DIR not found
ORA-02063: preceding 3 lines from ADHOC_POS15
ORA-06512: at line 13
Édition finale: Succès! Apparemment, je ne peux pas interroger certaines tables. Alors j'ai juste sorti ces tables.
codage final est:
declare
query varchar2(10000);
update_count integer := 0;
prjt_name varchar2(100) := '01213264B';
cursor my_cur is (select table_name from [email protected] where column_name = 'PROJECT_ID' and owner = 'SANDBOX' and table_name in ('X'));
tableName varchar2(100);
begin
open my_cur;
loop
fetch my_cur into tableName;
exit when my_cur%NOTFOUND;
update_count := 0;
execute immediate
'select count(project_id) as "CNT" from sandbox.' || tableName || '@db2 '
|| ' where project_id = (select project_id from [email protected] where project_name = ''' || prjt_name || ''') '
into update_count;
if update_count > 0 then
dbms_output.put_line (tableName);
end if;
end loop;
close my_cur;
end;
Cela ne fait pas exactement ce que je voulais. Il envoie les résultats à dbms_output. Mais c'est un début! Merci à tous pour votre aide!
Je reçois toujours le même message d'erreur après la concaténation de la ligne "dans" comme vous l'avez montré. – tparker
Pourquoi ne pas utiliser null dans la partie déclaration. Cela ne marche pas dans plsql blok. – Valli
J'ai besoin de cette sous-requête car le nom prjct est créé et fourni par l'utilisateur. Mais notre système transforme ce nom en un nombre et le nombre est ce qui est utilisé pour identifier les changements. Je ne peux pas dépendre de l'utilisateur final pour savoir comment déterminer le numéro de projet. – tparker