2017-10-12 16 views
2

Je suis en train d'obtenir le nombre de lignes de la liste des tables où toutes les colonnes de la table devrait avoir Col_year = 1994.Python + SQL: Comment exécuter une procédure à partir de python? [PAS APPELER la procédure stockée]

Il cela est possible dans sql avec des boucles d'écriture en python, comme il faudrait beaucoup de coup de DB.

Pour ce faire, j'ai écrit un proc comme ci-dessous:

DECLARE 
    l_counter NUMBER; 
    tot_counter NUMBER; 
    v_sql varchar2(10000); 
    cursor c1 is 
    select table_name from ALL_TABLES 
    where table_name in ("Table1", "Table2", "Table3"); 

BEGIN 
    tot_counter := 0; 
    FOR rec IN c1 LOOP 
    v_sql := 'select count(*) from '|| rec.table_name ||' where Col_year = 1994'; 
    EXECUTE IMMEDIATE v_sql INTO l_counter; 
    tot_counter := tot_counter + l_counter; 
    DBMS_OUTPUT.PUT_LINE(rec.table_name || ' l_counter ' || l_counter || ' tot_counter ' || tot_counter); 

    END LOOP; 
END; 

Comment appeler cela de python?

La situation est que je ne peux pas créer cela dans la base de données réelle, car c'est juste un but temporaire. Par conséquent, je cherche quelque chose comme cursor.executeproc() insteat de cursor.callproc()? Est-ce possible?

+0

Vous devez ajouter la base de données, la version et l'adaptateur utilisés. –

+0

L'idée est d'exécuter dynamiquement une procédure ... Le scrip fait partie du code python. Par conséquent, je veux créer cette procédure dans la base de données. – neoman1

Répondre

1

D'abord, vous n'avez pas besoin d'une procédure une seule requête SQL peut le faire:

SQL Fiddle

Oracle 11g R2 Configuration du schéma:

Requête 1:

SELECT SUM(c) 
FROM (
    SELECT COUNT(*) c FROM Table1 WHERE Col_year = 1999 
    Union all 
    SELECT COUNT(*) c FROM Table2 WHERE Col_year = 1999 
    Union all 
    SELECT COUNT(*) c FROM Table3 WHERE Col_year = 1999 
) 

Results:

| SUM(C) | 
|--------| 
|  10 | 

En second lieu, voici un lien qui peut vous aider sur votre réponse:

Return variable from cx_Oracle PL/SQL call in Python

cx_Oracle and output variables

Et comment le faire (je peux » t le tester)

cursor = connection.cursor() 
lOutput = cursor.var(cx_Oracle.STRING) 
cursor.execute(""" 
      DECLARE 
       l_counter NUMBER; 
       tot_counter NUMBER; 
       v_sql varchar2(10000); 
       cursor c1 is 
       select table_name from ALL_TABLES 
       where table_name in (Table1, Table2, Table3); 

      BEGIN 
       tot_counter := 0; 
       FOR rec IN c1 LOOP 
       v_sql := 'select count(*) from '|| rec.table_name ||' where Col_year = 1994'; 
       EXECUTE IMMEDIATE v_sql INTO l_counter; 
       tot_counter := tot_counter + l_counter; 
       DBMS_OUTPUT.PUT_LINE(rec.table_name || ' l_counter ' || l_counter || ' tot_counter ' || tot_counter); 

       END LOOP; 
      END; 
      """) 
print lOutput