首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle将自定义表类型传递给存储过程

Oracle将自定义表类型传递给存储过程
EN

Stack Overflow用户
提问于 2016-03-18 17:25:46
回答 1查看 1.9K关注 0票数 0

FYI: Oracle12c

我创建了一个名为Payeezy_Error的自定义类型

代码语言:javascript
复制
create or replace TYPE PAYEEZY_ERROR
AS

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

然后又创建了一个表类型的Payeezy_Errors

代码语言:javascript
复制
create or replace TYPE PAYEEZY_ERRORS AS TABLE OF PAYEEZY_ERROR;

然后,我有一个以Payeezy_Errors作为IN参数的过程:

代码语言:javascript
复制
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(*)语句大喊大叫:

代码语言:javascript
复制
ORA-00942: table or view does not exist.

红色破折号在SELECTin_Errors下面。

在下面的过程中,我得到了同样的错误,第二行INSERT INTOin_Errors行也是红色破折号。

我已经退出并重新加载了Oracle SQL Developer,以查看它是否是缓存功能。我已经在网上搜索过了,但没有找到我的具体案例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-18 18:48:59

如果要在查询中使用表,则需要使用table运算符

代码语言:javascript
复制
SELECT
    COUNT(*)
  INTO
    var_ErrorCount
  FROM
    table( in_Errors );

这是可行的。但这意味着您将获取PL/SQL集合中的所有数据,将其移动到SQL,进行聚合,然后将结果返回给PL/SQL。在这种情况下,这样做可能会更有效率(而且代码更少)。

代码语言:javascript
复制
var_ErrorCount := in_Errors.count;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36090650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档