Oracle ส่งผ่านประเภทตารางที่กำหนดเองไปยังขั้นตอนการจัดเก็บ

ขอแจ้งให้ทราบ: ออราเคิล 12c

ฉันได้สร้างประเภทที่กำหนดเองชื่อ Payeezy_Error:

create or replace TYPE PAYEEZY_ERROR
AS

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

จากนั้นจึงสร้างตารางประเภท Payeezy_Errors:

create or replace TYPE PAYEEZY_ERRORS AS TABLE OF PAYEEZY_ERROR;

ฉันมีขั้นตอนที่ใช้ Payeezy_Errors เป็นพารามิเตอร์ 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;

เมื่อฉันรวบรวมโพรซีเดอร์ มันจะตะโกนใส่ฉันด้วยคำสั่ง SELECT COUNT(*) ว่า:

ORA-00942: table or view does not exist.

และขีดสีแดงอยู่ใต้ SELECT และ in_Errors

นอกจากนี้ในขั้นตอนนี้ ฉันได้รับข้อผิดพลาดเดียวกัน และบรรทัด INSERT INTO และ in_Errors ที่สองก็เป็นเส้นประสีแดงเช่นกัน

ฉันได้ออกและโหลด Oracle SQL Developer แล้วเพื่อดูว่าเป็นการแคชหรือไม่ ฉันค้นหาในเว็บแล้ว แต่ไม่พบกรณีเฉพาะของฉัน


person Grandizer    schedule 18.03.2016    source แหล่งที่มา


คำตอบ (1)


หากคุณต้องการใช้ตารางในแบบสอบถาม คุณจะต้องใช้ตัวดำเนินการ table

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

นั่นได้ผล แต่หมายความว่าคุณกำลังนำข้อมูลทั้งหมดที่คุณมีในคอลเลกชั่น PL/SQL ย้ายไปยัง SQL VM ทำการรวมกลุ่ม แล้วส่งคืนผลลัพธ์ไปยัง PL/SQL ในกรณีนี้น่าจะมีประสิทธิภาพมากกว่า (และโค้ดน้อยลง)

var_ErrorCount := in_Errors.count;
person Justin Cave    schedule 18.03.2016
comment
เห็นว่าฉันเป็นผู้ชาย SQL Server ฉันจะทำตามคำแนะนำของคุณและเปลี่ยนรหัสด้วย ขอบคุณ! - person Grandizer; 18.03.2016