2017-10-20 16 views
0

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.

Encountered 'Loop' Error

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!

Répondre

0

Une chose qui semble mal est que prjt_name est une chaîne, mais vous passez comme un numéro dans votre requête. Voici donc ce que je changerais:

|| 'where t.project_id = (select project_id from [email protected]_pos15 where project_name = upper(''' 
    || prjt_name 
    || '''))' 

Cela ajoute essentiellement ' ' autour de la valeur de chaîne. Puis, puisque vous obtenez 2 erreurs de votre exécution, il doit y avoir un problème avec le nom de table. Je préfère utiliser le curseur implicite, mais vous devriez essayer d'accéder au contenu du curseur, comme ci-dessous:

'select count(t.project_id) as "CNT" from sandbox.' 
    || tableName.table_name 
    || '@adhoc_pos15 t' 
    || 'where t.project_id = (select project_id from [email protected]_pos15 where project_name = upper(''' 
    || prjt_name 
    || '''))' 

et vous devez supprimer cette delete vous de votre curseur ... cela ressemble tout à fait tort. La boucle passe simplement aux enregistrements suivants

Espérons que cela vous aide.

0
declare 
     update_count integer := 0; 
     prjt_name varchar2(100) := '01213264B'; 
     tablename varchar2(100); 

     cursor my_cur is 
      select table_name 
       from [email protected]_pos15 
       where column_name = 'PROJECT_ID' and owner = 'SANDBOX'; 
    begin 
     OPEN my_cur; 
     LOOP 
     FETCH my_cur into tableName; 
      EXIT WHEN my_cur%NOTFOUND; 
      update_count := 0; 
      Execute immediate 
       'select count(t.project_id) as "CNT" from sandbox.' 
       || tableName 
       || '@adhoc_pos15 t' 
       || ' where t.project_id in (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; 
    CLOSE my_cur; 
    end; 

Vous avez manqué enfin une concaténation. Certaines erreurs de syntaxe trop

Note: -

Pourquoi avez-vous besoin d'un sous-requête ici?

where t.project_id in (select project_id from [email protected]_pos15 where project_name = upper(' 
      || prjt_name 

Vous pouvez remplacer par

where t.project_name = prjt_name 
+0

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

+0

Pourquoi ne pas utiliser null dans la partie déclaration. Cela ne marche pas dans plsql blok. – Valli

+0

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