如何在plsql中动态定义类型

2024-01-16

我有一个这样的程序:

create or replace procedure pname (tn varchar2) is
-- here i want to declare the variable

  col1 tn%COL_ID

begin

end;

我知道我作为参数传递的每个表都将包含名为 COL_ID 的列。但我无法做到这一点,我收到这样的错误

PLS-00487:对变量“tn”的引用无效 PL/SQL:忽略项目 PLS-00487:对变量“tn”的引用无效 PL/SQL:忽略项目

请帮助我如何声明这样的变量。


有趣的问题。正如 APC 所指出的,Oracle 不像其他语言那样具有反射功能,因此传入名称 (varchar2) 对 Oracle 没有多大帮助(尤其是在编译时)。我相信您在这里所说的是,您有一组表,它们都共享某些特征(以相同方式使用相同类型的一个或多个列),因此您想要创建一个通用函数,该函数适用于任何他们。

您可以执行此操作,但必须定义一个对象类型来定义各个表共享的公共列和类型。假设这是以下两列:

create or replace type my_obj as object (name varchar2(100), num number);

现在您的函数(或过程)将接受此类型作为参数:

create or replace function my_fn(obj my_obj) return varchar2 is
  begin
    -- do something with object
    return obj.name || ',' || obj.num;
  end;

你会这样称呼它:

declare
    obj my_obj;
    rv varchar2(1000);
  begin
    for rec in (select * from sometable)
    loop
      obj := my_obj(rec.some_varchar_col, rec.some_number_col);
      select my_fn(obj) into rv from dual;
      dbms_output.put_line(rv);
    end loop;
  end;

我能想到的唯一其他方法是接受弱类型的 sys_refcursor,然后强制调用 procs 发送正确的游标(由于潜在的运行时异常而存在风险,而且不是很清楚)。如果编码“通用”函数,我更喜欢上述方法。

编辑 为了完整起见,我将添加上面提到的 sys_refcursor 示例:

create or replace procedure my_proc(cur sys_refcursor) is
  v_name varchar2(100);
  v_num number;
begin
  loop
    fetch cur into v_name, v_num;
    exit when cur%notfound;

    -- do something with our common fields
    dbms_output.put_line(v_name || ',' || v_num);
  end loop;
end;

并称其为:

declare
  v_cur sys_refcursor;
begin
  open v_cur for select my_name, my_num from some_table;
  my_proc(v_cur);
  close v_cur;
end;

笔记 这看起来过于微不足道,只有 2 列(为什么不只是将参数设置为 varchar2 和数字),但您可能想要在函数中处理数十列,并且输入对象可以填充任意数量的列。

Cheers

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

如何在plsql中动态定义类型 的相关文章

  • Sql 查询:Sum,表中所有可能的行组合

    SQL Server 2008 R2 表结构示例 create table TempTable ID int identity value int insert into TempTable values 6 insert into Tem
  • 如何在没有 EF 的 ASP.NET MVC 中使用普通 sql?

    我有一个使用 linq to sql 的类 如何在 ASP NET MVC 3 中使用普通 sql 而不使用 EF 来实现相同的功能 public ActionResult Index var List from c in db OFFIC
  • 以无法破坏的方式限制表中允许的记录数量

    我们有一个 Web 应用程序 Grails 我们将根据用户数量为其出售许可证 数据库 Oracle 10g 中有一个表保存用户 客户将托管自己的软件和数据库副本 有人可以建议一些策略来限制允许存在于用户表中的记录数量 从而使客户无法合理地破
  • 在同一个表上组合两个 SQL SELECT 语句

    我想结合这两个 SQL 查询 SELECT FROM Contracts WHERE productType RINsell AND clearTime IS NULL AND holdTime IS NOT NULL ORDER BY g
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • SQL Server 查询结果集的大小

    SQL Server 中是否有确定结果集中 Mgmt Studio 查询中返回的数据大小 以 MEGS 为单位 您可以打开客户端统计信息 查询菜单 包括客户端统计信息 它给出执行查询时从服务器返回的字节数
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • 是否允许在流水线 PL/SQL 表函数中使用 SELECT?

    管道函数的文档指出 在 SQL 语句 通常是SELECT 并且在大多数示例中 管道函数用于数据生成或转换 接受客户作为参数 但不发出任何 DML 语句 现在 从技术上讲 可以使用 SELECT 而不会出现 Oracle 中的任何错误 ORA
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • Quartz.NET 设置 MisfireInstruction

    我正在使用 Quartz NET 在 C 中工作 并且在 CronTrigger 上设置失火指令时遇到问题 我正在运行安装了 Quartz DB 的 SQL 后端 我有以下代码 可以很好地创建作业和运行调度程序 IScheduler sch
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 消息 102,级别 15,状态 1,第 1 行“ ”附近的语法不正确

    我试图从临时表中查询 但不断收到此消息 Msg 102 Level 15 State 1 Line 1 Incorrect syntax near 有人能告诉我问题是什么吗 是因为要转换吗 查询是 select compid 2 conve
  • SQL Server 转换选择一列并将其转换为字符串

    是否可以编写一条从表中选择列并将结果转换为字符串的语句 理想情况下 我希望有逗号分隔的值 例如 假设 SELECT 语句看起来像这样 SELECT column FROM table WHERE column lt 10 结果是一列包含值的
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A
  • 案例陈述以确定我是否应该结合

    我目前想做某种条件联合 给出以下示例 SELECT age name FROM users UNION SELECT 25 AS age Betty AS name 假设我只想在 用户 计数 gt 2 时合并第二个语句 否则不合并两者 总之

随机推荐

  • Future 任务完成后 Java 进程没有退出

    这是我使用 Future 的代码片段 import java util concurrent import java util public class FutureDemo public FutureDemo Future Executo
  • 更改或删除 App Store 中的开发者名称

    我已经为我的客户创建了一个应用程序 我们已经用我的帐户发布了该应用程序 现在 他们想将开发商名称更改为他们公司的名称 有没有办法更改开发商名称 我可以将我的应用程序移至他们的企业帐户 以便开发者名称更改为他们的企业名称吗 是的 自 WWDC
  • 阅读 Fetch Promise 的正文

    我有以下用于上传到 Google Cloud 存储的快速端点 它工作得很好 来自 google api 的响应给了我一个唯一的文件名 我想将其传回我的前端 app post upload req res gt var form new fo
  • Spring Boot 与 POM 打包聚合器

    是否可以使用 Spring Boots Maven 插件命令spring boot run当项目的父POM因其子项目而使用打包模式POM时 我有一个多模块 Maven 项目 其中有一个 主 POM 它又是 Spring Boot 父模块的子
  • iPhone内存警告级别=2

    我有一个应用程序 可以将大量视图堆叠在一起 在某些时候 我收到内存警告级别 2 这是预期的 问题是 当我运行 Instruments 时 我没有任何内存泄漏 并且该应用程序占用了大约 9 10MB 的空间 这不是that我会说很多吗 问题是
  • 如何根据属性查找两个数组列表之间的差异?

    我有两个数组列表 每个都有 Employee 类型的对象列表 Employee 类如下所示 public class Employee Employee String firstname String lastname String emp
  • 防止 Thread.CurrentPrincipal 跨应用程序域传播

    有人可以阻止当前线程的 IPrincipal 在应用程序域边界上传播吗 我无法控制分配给线程的 IPrincipal 但我可以控制创建应用程序域 我想要这样做的原因是为了防止在主要对象类型程序集在其他域中不可用时发生序列化错误 Edit E
  • 如何为 1x1 Android 小部件创建清晰的背景图像?

    我正在创建一个 1x1 小部件 无论我尝试什么 我都无法让背景图像看起来漂亮且清晰 我已经阅读了几乎所有我能找到的资源 但我仍然无法获胜 我正在为 HTC Desire Nexus 1 进行设计 希望有人告诉我在 Photoshop 中创建
  • 在 Node.JS 中引用相对于应用程序根目录的文件的正确方法

    我有一个在 AWS EC2 的 Linux 上运行的 Node JS 应用程序 它使用 fs 模块读取 HTML 模板文件 这是应用程序的当前结构 server js templates my template html services
  • Angular 6 迁移 -.angular-cli.json 到 angular.json

    我已经将我的项目升级到 Angular 6 除了转换之外一切都很顺利 angular cli json文件 从我遵循的指南来看 据说这会自动转换它 npm install g angular cli npm 安装 angular cli n
  • 构建 SparkSession

    我有在齐柏林飞艇担任翻译的火花 我使用的是Spark2 0 我构建了一个Session Create 一般来说 你不应该初始化SparkSession nor SparkContext在齐柏林飞艇 Zeppelin 笔记本配置为为您创建会话
  • Haskell 中 (^) 的奇怪行为

    为什么 GHCi 下面给出了错误的答案 GHCi gt 20 24373193905347 12 2 20 24373193905347 24 4 503599627370496e15 Python3 gt gt gt 20 2437319
  • 从沙箱 iFrame 到主窗口的 PostMessage,origin 始终为 null

    关于 javascript postMessage 事件的事件起源 我不明白一些事情 这是我的主页 h1 Test h1 h2 Outside h2 和我的 i
  • 在 Saleor 中编辑模型并扩展数据库结构

    我最近将 Saleor 2 9 分叉为一个网络应用程序 我正在为一家艺术画廊构建该应用程序 该画廊希望展示其待售产品并为他们的艺术家提供一些宣传 我希望能够拥有一堆卡片 例如 我们的团队 组件 从后端的艺术家表中提取数据 该表存储有关艺术家
  • C++ 重载宏

    我看到了重载宏的不同解决方案和变通方法 但我似乎在这一点上遇到了困难 我有一个PRINT DEBUG打印到 Visual Studio 调试器的宏 define DEBUG PRINT message RPTN 0 message n VA
  • Node.js WriteStream 在关闭之前不会将数据写入文件

    我怎样才能将数据写入文件WriteStream write 叫做 编辑 事实证明 当我使用 REPL 并调用该函数时 这是有效的 但是 这在我的程序中不起作用 import as FS from fs import LetterGroup
  • 'this' 关键字作为属性

    我很了解 C 但这对我来说很奇怪 在一些旧程序中 我看到过这样的代码 public MyType this string name some code that finally return instance of MyType 怎么称呼
  • 堆和栈内存是如何管理、实现和分配的?

    在 C C 中 我们可以在堆栈或堆上存储变量 函数 成员函数 类的实例 每一项是如何实施的 它是如何管理的 高层 gcc 是否预先分配一块内存用于堆栈和堆 然后根据请求分配出去 原始内存是来自RAM吗 函数可以分配在堆上而不是堆栈上吗 澄清
  • 为什么会话 bean 方法在抛出 RuntimeException 时抛出 EjbTransactionRolledbackException

    我试图通过约束验证来持久化实体 当调用持久化时 抛出约束并且调用者得到EjbTransactionRolledbackException 所以我尝试显式调用验证并抛出ConstraintViolationException RuntimeE
  • 如何在plsql中动态定义类型

    我有一个这样的程序 create or replace procedure pname tn varchar2 is here i want to declare the variable col1 tn COL ID begin end