Comment exécuter des commandes SQL non requête à l'aide de CX_Oracle?
Question
J'essaie d'exécuter ces commandes en utilisant cx_oracle:
begin
add_command_pkg.add_command
( command_id => 7,
expiry_time => sysdate + 7
);
add_command_pkg.add_command
( command_id => 12,
expiry_time => sysdate + 7
);
commit;
end;
Donc c'est mon code Python:
dsn = cx_Oracle.makedsn(hostname, port, sid)
orcl = cx_Oracle.connect(username + '/' + password + '@' + dsn)
curs = orcl.cursor()
cmd = "begin \n\
add_command_pkg.add_command \n\
( command_id => 7, \n\
expiry_time => sysdate + 7 \n\
); \n\
\n\
add_command_pkg.add_command \n\
( command_id => 12, \n\
expiry_time => sysdate + 7 \n\
); \n\
commit; \n\
end;"
curs.execute(cmd)
orcl.close()
Quand j'exécute ce code, je reçois cette erreur:
cx_oracle.interfaceError: pas une requête
Alors, comment exécuter ces commandes SQL qui ne sont pas des requêtes en utilisant cx_oracle?
EDIT:
Après avoir apporté des modifications, c'est ce que j'ai maintenant:
curs.callproc('add_command_pkg.add_command', [], { 'command_id' : 7, 'session_id' : 'null', 'p_expiry_time' : 'sysdate + 7', 'config_id' : 6 })
Quand je cours cela, je reçois cette erreur:
fichier "n: \ app \ mainwidget.py", ligne 456, dans myfunc
'config_id': 6})
cx_oracle.databaseError: ORA-01858: Un caractère non numérique a été trouvé où un chiffre était attendu de
Ora-06512: à la ligne 1aussi, comment puis-je commettre ceci?
La solution
Le meilleur moyen consiste à appeler la procédure directement à l'aide de callproc
.
curs.callproc['add_command_pkg.add_command',['7', 'sysdate + 7']]
orcl.commit()
ou si vous devez utiliser des arguments mots clés, utilisez directement un dictionnaire, pas une liste.
curs.callproc['add_command_pkg.add_command'
, {'command_id' : '7', 'expiry_time' : 'sysdate + 7'}]
orcl.commit()
La syntaxe réelle est
curs.callproc['package_name.procedure_name'
, ['list_argument1', 'list_argument2']
, {'keyword_argument1' : 'keyword1'}
]
qui est identique à celui suivant dans Oracle
begin
package_name.procedure_name( 'list_argument1', 'list_argument2'
, keywork_argument1 => 'keyword1');
end;
tandis que je suis sur la méthode connect
peut être appelée de la manière suivante sans avoir besoin de concaténation:
cx_Oracle.connect(username, password, dsn)