1. ホーム
  2. oracle

[解決済み] PLS-00382: 式が不正です。

2022-02-08 14:01:31

質問

というプロシージャが定義されています。

create or replace
PACKAGE BODY PKG_BG_PRVDR_SCOPE_GROUP 
AS

g_return_code           NUMBER := 99;
g_return_text           VARCHAR2(500) := '';
g_return_desc           VARCHAR2(500) := '';
c_return_length         CONSTANT NUMBER := 500;
g_revision_frozen       NUMBER    := -459;
g_timestamp_error       NUMBER := -86;

c_invalid_row_count     CONSTANT VARCHAR2(100) := 'database integrity check failed';

revision_frozen         EXCEPTION;
duplicate_item          EXCEPTION;
invalid_row_count       EXCEPTION;
invalid_update_ts       EXCEPTION;


PROCEDURE update_bg_provider_scope_group
  (
    p_region_id              IN    bg_prvdr_scope_group.region_id%TYPE,
    p_revision_id            IN    bg_prvdr_scope_group.revision_id%TYPE,
    p_bg_revision_id         IN    bg_prvdr_scope_group.bg_revision_id%TYPE,
    p_classification_id      IN    bg_prvdr_scope_group.classification_id%TYPE,
    p_facility_id            IN    bg_prvdr_scope_group.facility_id%TYPE,
    p_user                   IN    bg_prvdr_scope_group.create_user_id%TYPE,
    p_current_timestamp      IN    bg_prvdr_scope_group.create_ts%TYPE,
    p_group_name             IN    bg_prvdr_scope_group.group_nm%TYPE,
    p_description            IN    bg_prvdr_scope_group.description%TYPE,
    p_prvdr_scope_grp_id     IN    bg_prvdr_scope_group.provider_group_id%TYPE,
    p_ora_rowscn             IN    NUMBER,
    p_cur_out                OUT   g_cursor
  )
  IS
        lv_count_name               NUMBER(10)     := 0;
    lv_count                    NUMBER(10)     := 0;
    lv_last_update_user_id      VARCHAR2(30)     := '';
    lv_user_first_and_last_nm   VARCHAR2(100)     := '';
    lv_current_ts               TIMESTAMP(6) WITH TIME ZONE;
    lv_ora_row_scn              NUMBER;
    lv_error_desc               VARCHAR2(300) := NULL;
  BEGIN
      DBMS_OUTPUT.PUT_LINE('1');

実行すると、次のようなエラーが発生します。 データベース SA_Sandbox4 に接続中です。 ORA-06550: 25 行目、19 列目。 PLS-00382: 式が間違ったタイプです。 ORA-06550: 25 行目、3 列目。 PL/SQLです。ステートメント無視 プロセスが終了しました。 データベース SA_Sandbox4 との接続を解除します。

Beginに入らない...

で実行する。

DECLARE
  P_REGION_ID NUMBER;
  P_REVISION_ID NUMBER;
  P_BG_REVISION_ID NUMBER;
  P_CLASSIFICATION_ID NUMBER;
  P_FACILITY_ID VARCHAR2(10);
  P_USER VARCHAR2(30);
  P_CURRENT_TIMESTAMP TIMESTAMP;
  P_GROUP_NAME VARCHAR2(50);
  P_DESCRIPTION VARCHAR2(255);
  P_PRVDR_SCOPE_GRP_ID NUMBER;
  P_ORA_ROWSCN NUMBER;
  P_CUR_OUT SA_SANDBOX4.PKG_BG_PRVDR_SCOPE_GROUP.g_cursor;
BEGIN
  P_REGION_ID := 51;
  P_REVISION_ID := 1;
  P_BG_REVISION_ID := 1;
  P_CLASSIFICATION_ID := 1;
  P_FACILITY_ID := 'GIL';
  P_USER := 'a12345';
  P_CURRENT_TIMESTAMP := localtimestamp;
  P_GROUP_NAME := 'modificationtest';
  P_DESCRIPTION := 'modified successfully';
  P_PRVDR_SCOPE_GRP_ID := 42;
  P_ORA_ROWSCN := localtimestamp;

  PKG_BG_PRVDR_SCOPE_GROUP.UPDATE_BG_PROVIDER_SCOPE_GROUP(
    P_REGION_ID => P_REGION_ID,
    P_REVISION_ID => P_REVISION_ID,
    P_BG_REVISION_ID => P_BG_REVISION_ID,
    P_CLASSIFICATION_ID => P_CLASSIFICATION_ID,
    P_FACILITY_ID => P_FACILITY_ID,
    P_USER => P_USER,
    P_CURRENT_TIMESTAMP => P_CURRENT_TIMESTAMP,
    P_GROUP_NAME => P_GROUP_NAME,
    P_DESCRIPTION => P_DESCRIPTION,
    P_PRVDR_SCOPE_GRP_ID => P_PRVDR_SCOPE_GRP_ID,
    P_ORA_ROWSCN => P_ORA_ROWSCN,
    P_CUR_OUT => P_CUR_OUT
  );
  /* Legacy output: 
DBMS_OUTPUT.PUT_LINE('P_CUR_OUT = ' || P_CUR_OUT);
*/ 
  :P_CUR_OUT := P_CUR_OUT; --<-- Cursor
END;

解決方法は?

匿名ブロックの25行目は、以下のように表示されます。

P_ORA_ROWSCN := localtimestamp;

P_ORA_ROWSCN が定義されています。 NUMBER . localtimestamp が返されます。 TIMESTAMP . からの暗黙の変換はありません。 TIMESTAMPNUMBER で、変換に失敗します。 を初期化するために何を使いたいのか、私には明らかではありません。 P_ORA_ROWSCN . 通常であれば、それは ORA_ROWSCN の擬似カラムは、特定のテーブルの特定の行の擬似カラムです。 しかし、もしかしたら dbms_flashback.get_system_change_number ? あるいは ROWSCN が、実際にはOracleのシステム変更番号(SCN)を意味しているわけではありません。

ちなみに、投稿されたパッケージの定義はコンパイルできません。 g_cursor のように、パッケージで定義されていないものがあります。 もしかして、パッケージの定義を投稿するときに、それを削除したのですか? 匿名ブロックでは、その型がそのパッケージで宣言されていることを期待しているようですから。