0

要件により、あるストアドプロシージャを別のストアドプロシージャから呼び出す必要があります。

out_result_size問題は、私が使用している出力パラメーターのどこかにあるようです。テストmain_funcすると正常に動作しますが、テストsynonym_procすると

synonym_procが無効です

最終的には、synonym_procJPAを使用してJavaから呼び出す必要があります@NamedNativeQuery

CREATE OR REPLACE PROCEDURE synonym_proc (
    result_cursor      OUT SYS_REFCURSOR,
    in_cp_id           IN NUMBER,
    in_cp_name         IN VARCHAR2 := NULL,
    in_country_name    IN VARCHAR2 := NULL,
    in_industry_name   IN VARCHAR2 := NULL,
    in_max_result_size IN NUMBER
) AS
    out_result_size NUMBER;
BEGIN
   result_cursor := someSchema.somePackage.main_func(in_cp_id,
              in_cp_name,
              in_country_name,
              in_industry_name,
              in_max_result_size,
              out_result_size);
END;

更新:私が以前に気づかなかった質問の変更について言及しなかったことをお詫びします。これmain_funcは関数(プロシージャではありません)であり、カーソルを返し、スキーマ内のパッケージ内にあります。コンパイルすると、次のコンパイルエラーが発生します。

エラー:PLS-00201:識別子'SOMESCHEMA.SOMEPACKAGE'を宣言する必要があります。ステートメントは無視されます。

アップデート2

SomeSchemaの定義

CREATE OR REPLACE PACKAGE someSchema."SomePackage"
is
...
function mainFunc
(
    in_cp_id                in gem.tcp_real_profile_main_approved.cp%type
    , in_cp_name            in gem.tcp_real_profile_main_approved.name%type
    , in_country_name       in gem.tcp_real_profile_main_approved.country_name%type
    , in_industry_name      in gem.tcp_real_profile_main_approved.industry_name%type
    , in_max_result_size    in number
    , out_result_size       out number
)
return search_result_type_cursor;

追加した

type search_result_type_cursor
 is ref cursor
 return search_type;

そして、はい、関数(main_func)を記述し、データ型を相互検証したので、データ型は正しいです。

4

3 に答える 3

4

コメントに基づいて、特に他のスキーマで手順を記述してテストできることから、これは権限の問題である可能性があります。他のスキーマのオブジェクトに対する権限がロールを介して付与されている場合、パッケージ プロシージャを直接実行できますが、名前付きブロック内ではロールが認識されません。これが問題である場合はsomeSchema.somePackage、ストアド プロシージャを作成しているユーザーに直接付与された実行権限を取得する必要があります。

この問題を実証するために、SCOTTスキーマにパッケージを作成し、そのパッケージに対する実行権限をロールに付与し、そのロールをユーザーに付与します。どちらもテスト用に作成しました。としてSYS

create role scott_tmp_role;
grant connect to someuser identified by <password>;
grant scott_tmp_role to someuser;
grant create procedure to someuser;

としてSCOTT

create package p42 as
    procedure proc;
end p42;
/

Package created.

create package body p42 as
    procedure proc is
    begin
        null;
    end proc;
end p42;
/

Package body created.

grant execute on p42 to scott_tmp_role;

Grant succeeded.

新しい として、SOMEUSER私が持っている役割を確認します。

select * from session_roles;

ROLE
------------------------------
CONNECT
SCOTT_TMP_ROLE

無名ブロックでプロシージャを実行できます。

begin
    scott.p42.proc;
end;
/

PL/SQL procedure successfully completed.

...しかし、名前付きブロックではありません:

create or replace procedure sp42 as
begin
    scott.p42.proc;
end;
/

Warning: Procedure created with compilation errors.

show errors

Errors for PROCEDURE SP42:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/2      PL/SQL: Statement ignored
3/2      PLS-00201: identifier 'SCOTT.P42' must be declared

SCOTT新しいユーザーに直接アクセス許可を付与する場合:

grant execute on p42 to someuser;

...その後、名前付きブロックが機能するようになりました:

create or replace procedure sp42 as
begin
    scott.p42.proc;
end;
/

Procedure created.

実行権限を取得している場所を確認したい場合は、次のようなクエリを実行できますが、選択する役割の階層がある場合があります。

select grantee, privilege from all_tab_privs
where table_schema = 'SomeSchema'
and table_name = 'SomePackage';
于 2012-07-04T08:06:36.077 に答える
1

プロシージャまたは関数のパラメーターのサイズを指定することはできません。commitVincent が提案したように、サイズを削除するだけでなく、サイズを移動してみてください。

CREATE OR REPLACE PROCEDURE synonym_proc(result_cursor      OUT SYS_REFCURSOR,
                                         in_cp_id           IN NUMBER,
                                         in_cp_name         IN VARCHAR2,
                                         in_country_name    IN VARCHAR2,
                                         in_industry_name   IN VARCHAR2,
                                         in_max_result_size IN NUMBER) AS
  out_result_size NUMBER;
BEGIN
  main_proc(result_cursor,
            in_cp_id,
            in_cp_name,
            in_country_name,
            in_industry_name,
            in_max_result_size,
            out_result_size);
  COMMIT;
END;

次のようなエラーが表示されるはずですPLS-00103: Encountered the symbol "(" when expecting one of the following: ...

于 2012-07-03T10:48:54.130 に答える
0

Oracle SP の構文は次のとおりです。

CREATE OR REPLACE PROCEDURE procedure_name(--parameter list) AS
--Local Variables
BEGIN
--Body
END;

COMMIT を END の前に置くのではなく、END の後に置くという間違いを犯しました。このようになるはずです

COMMIT;
END;
于 2012-07-03T10:08:20.933 に答える