2009-03-18 4 views
3

Новичок вопрос: У меня есть хранимая процедура (только процедура, без каких-либо пакетов) в базе данных Oracle:Запуск Oracle хранятся прок от C#

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

и она отлично работает в ЖАБА. Однако, когда я пытаюсь запустить его из C# он жалуется:

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 

отношение C# код:

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

ответ

3

Убедитесь, что пользователь Oracle, с которым подключается ваше приложение .NET, имеет разрешения на выполнение хранимой процедуры.

+0

да, это была проблема – Grzenio

+0

@Ian Нельсон, @Grzenio - У меня есть подобный вопрос. Такая же ошибка и код C# выглядят одинаково, но я использую 'ExecuteReader()'. Я не вижу, как это могут быть разрешения, поскольку идентификатор пользователя, с которым я соединяюсь, является владельцем схемы и конкретных процедур. Возможны ли другие причины? –

0

Вы включая имя пакета в переменной ИмяПроцедуры?

i.e. setting procedureName to "FII_DBO.CLEAR_UNIT_TEST_PRODUCT", а не только "CLEAR_UNIT_TEST_PRODUCT"?

+0

Да, попробовал, что хорошо: идентификатор «FII_DBO.CLEAR_UNIT_TEST_PRODUCT» должен быть объявлен – Grzenio

0

Ваша процедура создается в другой схеме.

Выпуск

ALTER SESSION SET CURRENT_SCHEMA = FII_DBO 

сразу после подключения.

Я помню, что у провайдера есть некоторые ошибки с вызовом хранимых процедур.

Установите ваш CommandText в

BEGIN FII_DBO.CLEAR_UNIT_TEST_PRODUCT(); END; 

и CommandType к Text

Кроме того, вы можете попытаться изменить случае вы сохранили имя процедуры, как:

fii_dbo.clear_unit_test_product 

, я помню, что дело имеет значение.

1

Обнаружило, что сообщение об ошибке было немного ошибочным. Я выполнял его как другого пользователя, у которого не было надлежащих прав доступа. Это сделал трюк:

grant execute on FII_DBO.CLEAR_UNIT_TEST_PRODUCT to FII_USER; 
+1

Да, сообщение об ошибке менее полезно, но я думаю, что это делается для целей безопасности. Если пользователь не может получить доступ к хранимой процедуре, то база данных даже не признается в ее существовании. –

Смежные вопросы