从过程中调用带有表参数的函数时出现编译错误

2024-01-07

在一个包中,我有:

  1. 一种数字表
  2. 以所述数字表类型作为参数的函数
  3. 需要使用数字表类型调用所述函数的过程

我知道类型有效,我知道功能有效。但是当我尝试在过程中调用函数时,出现以下编译错误:

错误(262,16):PLS-00306:调用中参数的数量或类型错误 到“[FUNCTION]”错误(262,16):PL/SQL:ORA-00904: “[PACKAGE]”。“[FUNCTION]”:无效标识符错误(264,41):PLS-00642: SQL 语句中不允许使用本地集合类型

包头:

CREATE OR REPLACE PACKAGE [PACKAGE] AS 

    TYPE NUMBER_LIST IS TABLE OF NUMBER;

    FUNCTION [FUNCTION] (
        [LIST_PARAM]       NUMBER_LIST
      ) RETURN VARCHAR2;

    PROCEDURE [PROCEDURE] (
        RECORDS_AFFECTED    OUT NUMBER
      );

END [PACKAGE];

问题代码:

  PROCEDURE [PROCEDURE](
      RECORDS_AFFECTED    OUT NUMBER
  )AS
      [ID_LIST]  NUMBER_LIST;
  BEGIN
      ...

      SELECT  [COLUMN]
      BULK COLLECT INTO    [ID_LIST]
      FROM    [TABLE]

      INSERT INTO [TABLE]( [COLUMN] )
      SELECT   [FUNCTION]( LIST_PARAM => [ID_LIST] )
      FROM    [OTHER TABLE];

      ...  
  END [PROCEDURE];

错误围绕这一行:

SELECT   [FUNCTION]( LIST_PARAM => [ID_LIST] )

我努力了:

[ID_LIST]  NUMBER_LIST;
[ID_LIST]  [PACKAGE].NUMBER_LIST;

SELECT   [FUNCTION]( [ID_LIST] )
SELECT   [FUNCTION]( LIST_PARAM => [ID_LIST] )
SELECT   [PACKAGE].[FUNCTION]( [ID_LIST] )
SELECT   [PACKAGE].[FUNCTION]( LIST_PARAM => [ID_LIST] )

但我觉得问题出在 [ID_LIST] 的传递方式上。

关于我将这个 Type TABLE OF NUMBER 参数传递给函数时做错了什么有什么想法吗?


问题不在于函数本身的参数列表,而在于您尝试在 SQL 语句中使用本地定义的类型 NUMBER_LIST(即 PLS-00642 错误)。 SQL 引擎对此类型一无所知。您必须创建一个数据库类型才能成功,例如:

CREATE OR REPLACE  TYPE NUMBER_LIST IS TABLE OF NUMBER;

或者是这样的:

  PROCEDURE [PROCEDURE](
      RECORDS_AFFECTED    OUT NUMBER
  )AS
      [ID_LIST]  NUMBER_LIST;
      fnc_ret    VARCHAR2;
  BEGIN
      ...

      SELECT  [COLUMN]
      BULK COLLECT INTO    [ID_LIST]
      FROM    [TABLE]

      fnc_ret := [FUNCTION]( LIST_PARAM => [ID_LIST] );

      INSERT INTO [TABLE]( [COLUMN] )
      VALUES (fnc_ret);

      ...  
  END [PROCEDURE];

您可能需要修改它以适合您的实际代码,但这就是想法。如果不将 ID_LIST 设为数据库定义类型,则无法在 SQL 语句中使用 ID_LIST,因为 SQL 引擎看不到它。

PL/SQL 是 RDBMS 中的一个“引擎”。它有一个语句处理器,当它遇到一条SQL语句时,它就把它交给SQL“引擎”来处理。我想你可以明白为什么会导致这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从过程中调用带有表参数的函数时出现编译错误 的相关文章

随机推荐

  • 在 Internet Explorer 中输入文件长度

    我想获取为输入文件选择的文件数 在 HTML 中 我有
  • 为什么 Dart 中显式使用“.cast<>()”函数而不是“as <>”

    在我的问题中Dart 2 X List cast 不组合 https stackoverflow com questions 49539879 dart 2 x list cast does not compose答案需要转换List
  • 如何发布Web应用程序?

    我真的不知道如何在Web开发中正确执行从离线开发到实时Web服务器的部署 我主要依靠直觉 但这或多或少是我到目前为止所做的 我有一个 python 或 php 的 Web 应用程序 并将其托管在实时 Web 服务器上 我用的是离线开发版本
  • 使用终端和 MacFusion 时出现 GIT_DISCOVERY_ACROSS_FILESYSTEM 问题

    我使用 MacFusion 和 OSXFuse 类似于 MacFuse 通过 SSH 将我的服务器安装到我的办公室计算机上 当我 cd 进入服务器上的 Rails 工作目录时 我在 zsh 提示符中看不到任何 git 信息 如果我尝试 gi
  • Android 中的 HTTP 客户端 API 级别 11 或更高级别

    我有 Jersey 实现的 Restful Web 服务 我通过 HTTP 客户端从 Android 进行连接以获取数据 它在 API 级别 10 及更早版本中工作正常 但在 API 级别 11 或更高版本上则不行 我很感激任何帮助 我在这
  • 按元素上的条件值对 numpy 数组元素进行排序

    我需要通过增加与另一个点的距离来对点的 numpy 数组进行排序 import numpy as np def dist i j ip jp return np sqrt i ip 2 j jp 2 arr np array 0 0 1 2
  • @Valid 注释在应用于 MultipartFile 对象时会被忽略

    这是我的控制器 它接受一个multipart form data有两个字段的请求 form and file The form字段是一个MyObject the file字段是一个MultipartFile 两个变量都注释为 Valid 因
  • 自定义商店页面产品以直接进入联属网站

    我需要在 WooCommerce 上使用什么 这样当您在商店 目录页面上看到产品时 它会直接链接到联属网站 而不是通过单个产品页面 然后 如果可能的话 在新选项卡中打开它 Thanks 更新 添加了 WC 3 兼容性 对于您的情况 您需要自
  • DDD,反腐败层,如何做?

    目前 我们必须构建一个基于遗留应用程序的应用程序 旧应用程序的代码应该被丢弃并重写 但正如通常情况一样 我们需要在其基础上创建新的东西 而不是重写它 最近 我们决定走领域驱动设计之路 因此 反腐败层可以解决我们的问题 据我了解 这样应该可以
  • 如何在 Tornado 中将异步函数和 gen 函数包装在一起?

    如何在 Tornado 中将异步函数和 gen 函数包装在一起 我的代码如下所示 错误是 Future 对象没有属性 body 我是否以错误的方式放置了装饰器 import tornado httpclient import tornado
  • 如何使这种排序不区分大小写?

    def sortProfiles p return sorted p key itemgetter first name 我有一个带有字典的列表 这个函数允许我按他们的名字对他们进行排序 但是 它区分大小写 gt gt gt from op
  • 甲骨文银行家规则

    为什么 Oracle 不使用银行家统治 http en wikipedia org wiki Rounding Round half to even 舍入方法 精确的十进制算术是一个庞大而复杂的课题 如果你想阅读关于这个主题的 ahem O
  • 默认模板参数和部分特化

    请向我解释为什么下面的代码符合并完美运行 我很困扰 include
  • javascript 将事件绑定到类名的更改

    javascript jQuery 是否可以将函数绑定到 DOM 元素的类名更改或分配新类 不 更新类时不会触发广泛支持的事件 你必须进行民意调查 部分浏览器支持DOM 突变事件 http www w3 org TR DOM Level 3
  • Laravel 5.3 中的路由保护问题

    我在 Laravel 中创建了一个登录 注册页面 它工作正常 但我想通过允许经过身份验证的用户单独访问 URL 来保护路由 这是我的 web php Route get uses gt UserController getLogin as
  • 如何修改 Swing 在布局文本组件时使用的剪辑字符串省略号

    默认情况下 Swing 使用省略号 来指示 JLabel 和类似的基于文本的组件中的文本已被截断 是否可以更改此行为以使用不同的字符串 例如 gt 通过查看 Swing 代码 我在 SwingUtilities2 中发现了一个名为 Clip
  • Angular-ui-router 打字稿定义

    当我们更新应用程序以使用 angular ui router v1 0 3 时 我们在打字稿定义方面遇到了一些问题 由于我们使用 stateChangeSuccess 事件 迁移指南告诉我们现在应该使用 TransitionService
  • 以幂形式表示的整数

    一个号码N据说可以用幂形式表达 如果对于某些a gt 0还有一些x gt 1 我们有N a x 现在为了检查这一点 我们可以取两边的对数 方程变为log n log a x所以通过迭代 2 sqrt n 如果存在任何给出的数字x作为该数的幂
  • 如何在 Gitlab 中成功管道的末尾创建合并请求?

    我对 gitlab 和 gitlab CI 非常陌生 我已经建立了一个正在成功完成的管道 我的主分支和开发分支受到保护 因此需要合并请求 以便组中的另一个开发人员可以在合并之前查看代码和评论 我想知道是否可以在此管道的末尾生成此合并请求 g
  • 从过程中调用带有表参数的函数时出现编译错误

    在一个包中 我有 一种数字表 以所述数字表类型作为参数的函数 需要使用数字表类型调用所述函数的过程 我知道类型有效 我知道功能有效 但是当我尝试在过程中调用函数时 出现以下编译错误 错误 262 16 PLS 00306 调用中参数的数量或