2014-02-13 2 views
0

Я создал пакет:Execute Oracle ХП с использованием .Net

create or replace PACKAGE merc 
AS 
TYPE resultcurtyp is REF CURSOR; 
END merc; 

а затем хранимая процедура:

create or replace PROCEDURE merc_results 
(
testP IN VARCHAR2 DEFAULT NULL, 
CURSOR_ IN OUT merc.resultcurtyp 

) AS 
BEGIN 
    OPEN CURSOR_ FOR 
    SELECT /*csv*/ 
    FR.* 
    FROM DS.table1 FR 
    INNER JOIN DS.price PN ON PN.OBJECTID = FR.SOURCEID 
    WHERE FR.NAME = testP 
END merc_results; 

В то время как вызов ХП код формы .Net дает мне:

ORA-06550: line 1, column 15: 
PLS-00222: no function with name 'merc' exists in this scope 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

Должен ли я создать пакет , вызов сохраняется из этого, а затем вызывает упаковку e из .Net? Я сейчас вызываю хранимый proc непосредственно из кода. Я раньше не работал с oracle db.

+0

Есть ли причина того, что вам нужно объявить свой собственный слабо типизированный курсор, а не только декларирует 'cursor_' типа' sys_refcursor'? Вы действительно хотите, чтобы параметр 'cursor_' был' IN OUT', а не просто 'OUT'? И почему вы используете подсказку '/ * csv * /' в хранимой процедуре - это просто директива разработчика SQL. Вы отметили это для SQL Developer, что заставляет меня подозревать, что подсказка 'csv' должна делать что-то функциональное? –

+0

Ну, вы не показываете код вызова C#. – OldProgrammer

+0

@JustinCave, он на самом деле не использует подсказку csv, ему не хватает плюса, '/ * + csv * /', поэтому это всего лишь комментарий. –

ответ

0

В C#:

OracleCommand cmd = new OracleCommand("yourshema.merc.merc_results", Connection); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("testP", testP); 
cmd.Parameters.Add("CURSOR_", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
OracleDataAdapter da = new OracleDataAdapter(cmd); 
DataSet ds = new DataSet(); 
da.Fill(ds); 
return ds; 

Oracle Пакет:

CREATE OR REPLACE PACKAGE merc 
IS 
    TYPE resultcurtyp IS REF CURSOR; 
    PROCEDURE merc_results(
     testP IN VARCHAR2 DEFAULT NULL, 
     CURSOR_ OUT resultcurtyp); 
END; 
/

CREATE OR REPLACE PACKAGE BODY merc 
IS 
    PROCEDURE merc_results(
    testP IN VARCHAR2 DEFAULT NULL, 
    CURSOR_ OUT resultcurtyp) 
    AS 
    BEGIN 
    OPEN CURSOR_ FOR SELECT 
    FR.* FROM DS.table1 FR INNER JOIN DS.price PN ON PN.OBJECTID = FR.SOURCEID WHERE FR.NAME = testP; 
    END merc_results; 
END merc; 
/
Смежные вопросы