2017-10-12 10 views
2

すべてのテーブルの列がCol_year = 1994である必要があるテーブルのリストから行の数を取得しようとしています。これは、Pythonの出力ループを使用しないsqlではそれは多くのDBヒットが必要になります。これを行うにはPython + SQL:Pythonからプロシージャを実行するには? [ストアドプロシージャを呼び出さない]

、私は以下のようなPROCを書かれている:

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; 

のpythonからこれを呼び出すには?

これは一時的な目的であるため、実際のデータベースではこれを作成できないという状況があります。したがって、cursor.callproc()のcursor.executeproc()insteatのようなものを探していますか?これは可能ですか?

+0

使用するデータベース、バージョン、およびアダプタを追加する必要があります。 –

+0

アイデアは動的にプロシージャを実行することです...スクリプトはPythonコードの一部です。したがって、このプロシージャをデータベースに作成したいと考えています。 – neoman1

答えて

1

まず、あなたは、単一のSQLクエリはそれを行うことができます手順は必要ありません。

SQL Fiddle

Oracleの11グラムR2スキーマのセットアップ

クエリ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 | 

第二に、ここにあなたの答えであなたを助けるかもしれないいくつかのリンクは次のとおりです。

Return variable from cx_Oracle PL/SQL call in Python

cx_Oracle and output variables

そして、どのようにそれを行うには(私は」することができますテストしてください)

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 
関連する問題