Oracle Melewati Tipe Tabel Kustom ke Prosedur Tersimpan

Untuk diketahui: Oracle 12c

Saya telah membuat tipe khusus yang disebut Payeezy_Error:

create or replace TYPE PAYEEZY_ERROR
AS

  OBJECT (
    CODE VARCHAR(30),
    DESCRIPTION VARCHAR(200)
  );

Dan kemudian pada gilirannya membuat tipe Tabel Payeezy_Errors:

create or replace TYPE PAYEEZY_ERRORS AS TABLE OF PAYEEZY_ERROR;

Saya kemudian memiliki Prosedur yang menggunakan Payeezy_Errors sebagai parameter IN:

create or replace PROCEDURE SAVE_USER_PAYMENT_TRANSACTION
(
  in_AccountID         IN VARCHAR2,
  in_SequenceID        IN VARCHAR2,
  in_CorrelationID     IN VARCHAR2,
  in_TransactionID     IN VARCHAR2,
  in_TransactionTag    IN VARCHAR2,
  in_Currency          IN VARCHAR2,
  in_TransactionType   IN VARCHAR2,
  in_BankResponse      IN VARCHAR2,
  in_GatewayResponse   IN VARCHAR2,
  in_ValidationStatus  IN VARCHAR2,
  in_TransactionStatus IN VARCHAR2,
  in_Errors            IN PAYEEZY_ERRORS
)
AS

  var_uptID NUMBER;
  var_ErrorCount NUMBER := 0;

  EX_AUTHENTICATION EXCEPTION;

BEGIN

  -- Insert the Payeezy Response values tied to the user
  INSERT INTO
    USER_PAYMENT_TRANSACTION (
      ACCOUNT_ID,         UP_PAYMENT_SEQ_ID,   CORRELATION_ID,       TRANSACTION_ID,
      TRANSACTION_TAG,    CURRENCY,            TRANSACTION_TYPE,     BANK_RESPONSE,
      GATEWAY_RESPONSE,   VALIDATION_STATUS,   TRANSACTION_STATUS
    ) VALUES (
      in_AccountID,       in_SequenceID,       in_CorrelationID,     in_TransactionID,
      in_TransactionTag,  in_Currency,         in_TransactionType,   in_BankResponse,
      in_GatewayResponse, in_ValidationStatus, in_TransactionStatus
    )
  RETURNING
    ID
  INTO
    var_uptID;

  -- Insert any errors that may be associated with a failure/unsuccessful transaction
  SELECT
    COUNT(*)
  INTO
    var_ErrorCount
  FROM
    in_Errors;

  IF (var_ErrorCount > 0) THEN
    INSERT INTO
      USER_PAYMENT_TRANSACTION_ERROR (
        UPT_ID, CODE, DESCRIPTION
      )
    SELECT
      var_uptID, e.CODE, e.DESCRIPTION
    FROM
      in_Errors;
  END IF;


  -- Exception Handling
  EXCEPTION
    WHEN EX_AUTHENTICATION THEN
      raise_application_error(-20001, 'Authentication Failed.');

END SAVE_USER_PAYMENT_TRANSACTION;

Ketika saya mengkompilasi prosedurnya, saya berteriak pada pernyataan SELECT COUNT(*) bahwa:

ORA-00942: table or view does not exist.

Dan garis merah berada di bawah SELECT dan in_Errors.

Lebih jauh ke bawah prosedur saya mendapatkan kesalahan yang sama dan baris INSERT INTO dan in_Errors kedua juga memiliki tanda hubung merah.

Saya telah keluar dan memuat ulang Oracle SQL Developer hanya untuk melihat apakah itu masalah cache. Saya telah mencari di web tetapi belum menemukan kasus khusus saya.


person Grandizer    schedule 18.03.2016    source sumber


Jawaban (1)


Jika Anda ingin menggunakan tabel dalam kueri, Anda perlu menggunakan operator table

SELECT
    COUNT(*)
  INTO
    var_ErrorCount
  FROM
    table( in_Errors );

Itu bekerja. Namun itu berarti Anda mengambil semua data yang Anda miliki di koleksi PL/SQL, memindahkannya ke VM SQL, melakukan agregasi, lalu mengembalikan hasilnya ke PL/SQL. Mungkin akan lebih efisien (dan lebih sedikit kode) dalam hal ini jika dilakukan

var_ErrorCount := in_Errors.count;
person Justin Cave    schedule 18.03.2016
comment
Mengingat saya adalah orang SQL Server, saya akan menerima rekomendasi Anda dan mengubah kodenya juga. Terima kasih! - person Grandizer; 18.03.2016