将参数从 Python 传递给 SQLPlus 脚本

时间:2021-07-06 16:07:34

标签: python-3.x oracle plsql sqlplus

我正在尝试将变量从 python 脚本传递到 PL/SQLscript。 但我收到“SP2-0310:无法打开文件”错误

代码如下:

def runSqlQuery():
    connectString = '<username>/"<password>"@//MYHOST:1521/TEST'
    var1=input('Enter VAR1: ')
    var2=input('Enter VAR2: ')
    session = ['sqlplus', '-S', connectString,f'@a.sql {var1} {var2}']
    subprocess.call(session)
runSqlQuery()

SET SERVEROUTPUT ON
 DECLARE
    TYPE usr IS VARRAY(100) OF VARCHAR2(100);
    v_new_rw_user           usr:=usr('&1');
    v_obj_owner             usr:=usr('&2');
 BEGIN
    FOR j IN v_new_rw_user.first..v_new_rw_user.last
    LOOP
        DBMS_OUTPUT.PUT_LINE('Read Only User : ' || UPPER(v_new_rw_user(j)) ||CHR(10));
        FOR i IN v_obj_owner.first..v_obj_owner.last
        LOOP
            DBMS_OUTPUT.PUT_LINE(CHR(10)||'Database Schema : ' || UPPER(v_obj_owner(i)) ||CHR(10));
        END LOOP;
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(CHR(10)||'ERROR CODE : ' || SQLCODE ||CHR(10) || 'ERROR MESSAGE: '|| SQLERRM || CHR(10));
END;
/
EXIT;


Appreciate any help. Thanks in advance

1 个答案:

答案 0 :(得分:0)

在此 tutorial 的帮助下,以下代码有效

TestSQPPlus.py

from subprocess import Popen, PIPE

def runSqlQuery():
    connectString = '<username>/"<password>"@//MYHOST:1521/TEST'
    var1=input('Enter VAR1: ')
    var2=input('Enter VAR2: ')
    sqlCommand = f'@a.sql {var1} {var2}'
    print(sqlCommand)
    session =  Popen(['sqlplus', '-S', connectString], stdin=PIPE, stdout=PIPE, stderr=PIPE)
    session.stdin.write(sqlCommand.encode())
    return session.communicate()
    
queryResult, errorMessage = runSqlQuery()
print(queryResult)
print(errorMessage)

a.sql

SET SERVEROUTPUT ON
 DECLARE
    TYPE usr IS VARRAY(100) OF VARCHAR2(100);
    v_new_rw_user           usr:=usr('&1');
    v_obj_owner             usr:=usr('&2');
 BEGIN
    FOR j IN v_new_rw_user.first..v_new_rw_user.last
    LOOP
        DBMS_OUTPUT.PUT_LINE('Read Only User : ' || UPPER(v_new_rw_user(j)) ||CHR(10));
        FOR i IN v_obj_owner.first..v_obj_owner.last
        LOOP
            DBMS_OUTPUT.PUT_LINE(CHR(10)||'Database Schema : ' || UPPER(v_obj_owner(i)) ||CHR(10));
        END LOOP;
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(CHR(10)||'ERROR CODE : ' || SQLCODE ||CHR(10) || 'ERROR MESSAGE: '|| SQLERRM || CHR(10));
END;
/
quit

执行示例(为简洁起见并格式化输出)

python TestSQPPlus.py
Enter VAR1: x
Enter VAR2: y

Read Only User : X
Database Schema : Y
PL/SQL-Prozedur erfolgreich abgeschlossen.

注意 - 如果您想在 VARRAY 中输入更多元素,您必须注入如下(自行使用)

python TestSQPPlus.py
Enter VAR1: x1','x2
Enter VAR2: y1','y2
@a.sql x1','x2 y1','y2

Read Only User : X1
Database Schema : Y1
Database Schema : Y2
Read Only User : X2
Database Schema : Y1
Database Schema : Y2
PL/SQL-Prozedur erfolgreich abgeschlossen.