2009-03-18 9 views
3

Une question débutant: J'ai un proc stocké (juste une procédure, sans paquets) dans la base de données Oracle:en cours Oracle stockées procs de C#

CREATE OR REPLACE procedure FII_DBO.CLEAR_UNIT_TEST_PRODUCT 
IS 
BEGIN 
... 
END CLEAR_UNIT_TEST_PRODUCT; 

et il fonctionne très bien dans TOAD. Cependant, lorsque je tente de l'exécuter à partir de C#, il se plaint:

System.Data.OracleClient.OracleException: ORA-06550: line 1, column 7: 
PLS-00201: identifier 'CLEAR_UNIT_TEST_PRODUCT' must be declared 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

code correspondant C#:

Command = new OracleCommand(); 
Command.CommandText = procedureName; 
Command.CommandType = CommandType.StoredProcedure; 
Command.Connection = connection; 
Command.ExecuteNonQuery(); 

Répondre

3

Vérifiez que l'utilisateur Oracle auquel votre application .NET se connecte dispose d'autorisations pour exécuter la procédure stockée.

+0

oui, c'était le problème – Grzenio

+0

@Ian Nelson, @Grzenio - J'ai un problème similaire. La même erreur et le code C# ressemble beaucoup, sauf que j'utilise 'ExecuteReader()'. Je ne vois pas comment cela pourrait être des permissions car l'identifiant d'utilisateur avec lequel je me connecte est aussi le propriétaire du schéma et des procédures spécifiques. D'autres raisons cela pourrait se produire? –

0

Vous y compris le nom du package dans la variable ProcedureName?

c.-à-d., Définition de procédureName à "FII_DBO.CLEAR_UNIT_TEST_PRODUCT", et pas seulement "CLEAR_UNIT_TEST_PRODUCT"?

+0

Ouais, essayé aussi bien: identifiant « FII_DBO.CLEAR_UNIT_TEST_PRODUCT » doit être déclaré – Grzenio

0

Votre procédure semble être créée dans un autre schéma.

Problème

ALTER SESSION SET CURRENT_SCHEMA = FII_DBO 

juste après la connexion.

Je rappelle que le fournisseur a quelques bugs avec l'appel de procédures stockées.

Définissez votre CommandText à

BEGIN FII_DBO.CLEAR_UNIT_TEST_PRODUCT(); END; 

et CommandType-Text

vous pouvez également essayer de changer le cas de vous avez enregistré le nom de procédure, comme:

fii_dbo.clear_unit_test_product 

, je me rappelle que l'affaire compte aussi.

1

Trouvé, le message d'erreur était un peu trompeur. Je l'exécutais comme un utilisateur différent, qui n'avait pas les droits d'accès appropriés. Cela a fait l'affaire:

grant execute on FII_DBO.CLEAR_UNIT_TEST_PRODUCT to FII_USER; 
+1

Oui, le message d'erreur est moins qu'utile, mais je suppose que la pensée est que c'est fait pour des raisons de sécurité. Si l'utilisateur ne peut pas accéder à la procédure stockée, la base de données n'admettra même pas son existence. –

Questions connexes