PLSQL 中的反思?

2023-11-25

我正在编写一个过程来处理存储在 ANYDATA 中的用户定义对象。对象类型和属性名称只能在运行时知道,因此我无法在声明部分为其定义变量。在Java中,我可以使用反射来处理它,我可以知道类名和字段名。然后我可以通过反射访问这些字段。有没有办法在 PLSQL 中做到这一点?我现在的想法是在过程中动态创建一个sql字符串并执行它。但这并不是我想要的。

假设用户 A 将 ADT 类型定义为create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));并创建一个对象实例并将其插入到 ANYDATA 中。

在我的过程中,不知怎的,我知道我需要处理这个对象的第一个属性,即 fname。因此,如果首先知道 adt 类型,我的代码将如下所示:

declare
  adobject A.Person_type; -- HERE! I don't know the type yet, so I can't define adobject!
  tempAnydata anydata;
  rt number;
  vbuffer varchar2(10);
  ...
begin
   select somecolumn 
   into tempAnydata 
   from sometable 
   where something='something' for update;

   rt := tempAnydata.GetObject(adobject);

   vbuffer := adobject.fname; -- HERE! I don't know the attribute name is fname!
   -- deal with vbuffer here
end;

那么我应该怎么做才能使其动态化呢?提前致谢。


你需要使用ANYTYPE来描述ANYDATA并确保类型正确。然后您可以使用访问该属性piecewise and getVarchar2.

下面的大部分代码用于检查类型,如果您不关心类型安全,则不需要检查类型。

返回值的函数:

create or replace function get_first_attribute(
    p_anydata in out anydata --note the "out" - this is required for the "piecewise"
) return varchar2 is
    v_typecode pls_integer;
    v_anytype anytype;
begin
    --Get the typecode, and the ANYTYPE
    v_typecode := p_anydata.getType(v_anytype);

    --Check that it's really an object
    if v_typecode = dbms_types.typecode_object then
        --If it is an object, find the first item
        declare
            v_first_attribute_typecode pls_integer;
            v_aname          varchar2(32767);
            v_result         pls_integer;
            v_varchar        varchar2(32767);
            --Variables we don't really care about, but need for function output
            v_prec           pls_integer; 
            v_scale          pls_integer;
            v_len            pls_integer;
            v_csid           pls_integer;
            v_csfrm          pls_integer;
            v_attr_elt_type  anytype;
        begin
            v_first_attribute_typecode := v_anytype.getAttrElemInfo(
                pos            => 1, --First attribute
                prec           => v_prec,
                scale          => v_scale,
                len            => v_len,
                csid           => v_csid,
                csfrm          => v_csfrm,
                attr_elt_type  => v_attr_elt_type,
                aname          => v_aname);

            --Check typecode of attribute
            if v_first_attribute_typecode = dbms_types.typecode_varchar2 then
                --Now that we've verified the type, get the actual value.
                p_anydata.piecewise;
                v_result := p_anydata.getVarchar2(c => v_varchar);

                --DEBUG: Print the attribute name, in case you're curious
                --dbms_output.put_line('v_aname: '||v_aname);

                return v_varchar;
            else
                raise_application_error(-20000, 'Unexpected 1st Attribute Typecode: '||
                    v_first_attribute_typecode);
            end if;
        end;
    else
        raise_application_error(-20000, 'Unexpected Typecode: '||v_typecode);
    end if;
end;
/

Types:

create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));

create or replace type other_type as object (first_name varchar2(10), poetry clob);

测试运行:

declare
    --Create records
    v_type1 person_type := person_type('Ford', 'Prefect');
    v_type2 other_type := other_type('Paula', 'blah blah...');
    v_anydata anydata;
begin
    --Convert to ANYDATA.
    --Works as long as ANYDATA is an object with a varchar2 as the first attribute.
    v_anydata := anydata.convertObject(v_type1);
    dbms_output.put_line(get_first_attribute(v_anydata));

    v_anydata := anydata.convertObject(v_type2);
    dbms_output.put_line(get_first_attribute(v_anydata));
end;
/

Outputs:

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

PLSQL 中的反思? 的相关文章

  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 如何通过代码确定Oracle数据类型的字符串值?

    I use DBMS SQL DESCRIBE COLUMNS过程来确定 SELECT 查询的结果集中的列使用什么数据类型 但不幸的是这样我只能得到Oracle数据类型的代码 record col type 1 8 12 等 所以我想知道
  • 使用 Hibernate 或 Spring 打印 DBMS_OUTPUT.put_line

    我想知道 Hibernate 或 Spring 或任何第 3 方库是否提供将 DBMS OUTPUT put line 消息直接打印到 system out 或日志文件的能力 目的是在控制台中同时显示 PLSQL 日志消息和 java 日志
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经
  • java.sql.SQLSyntaxErrorException: ORA-00955: 名称已被现有对象使用

    我正在使用 Oracle 11g R2 我想创建一些用户表 当我运行查询时 它创建了几个表并生成java sql SQLSyntaxErrorException ORA 00955 名称已被现有对象使用例外 Connection con p
  • 关闭连接时 JDBC 事务回滚失败

    如果在提交期间与数据库资源的连接丢失 这可能会导致提交失败 然后回滚失败 是否有可能事务已部分提交 这似乎发生在我的案例中 但希望社区能更清楚地说明这一点 HibernateTransactionManager 和 Oracle 与 JDB
  • SQL在单个命令中在表中添加列和注释

    我的 Web 应用程序使用 Oracle 11g 我想向现有表添加列和注释 我可以使用以下命令轻松做到这一点 ALTER TABLE product ADD product description VARCHAR2 20 and COMME
  • ORA-1843: 更新记录时不是有效的月份

    我想出于某种目的更新我的日期列 已存储在列中的值如下所示 18 06 14 在更新时如果我不更新任何东西并调试和检查它 它的格式为2014 06 18T00 00 00 因此 在更新时 我在程序中收到如下错误 ORA 1843 月份无效 下
  • Microsoft T-SQL 到 Oracle SQL 的转换

    我已经使用 T SQL 多年了 但我刚刚转到一个需要编写一些 Oracle 内容的组织 可能只是简单的 CRUD 操作 至少在我适应之前是这样 我不会将数据库从一个数据库迁移到另一个数据库 只是从应用程序开发的角度与现有 Oracle 数据
  • java应用程序中与oracle的连接

    我已经下载了 oracle express 11g 版本并安装了它 现在我想从 java 应用程序连接它 这是我的连接代码 Class forName oracle jdbc driver OracleDriver newInstance
  • 如果运行战争,oracle 和 sybase 数据库连接会出现 ClassNotFoundError,但在 eclipse 中工作正常

    我在应用程序中构建了一个功能来测试数据库连接 在本地 我能够测试所有三个数据库 sqlserver sybase 和 oracle 但如果创建 war 文件并在 Windows Linux 服务器中运行 war 则 Oracle 和 syb
  • 使用 Python 使用正确的编码从 Oracle 导入

    我很抱歉提出一个字符编码问题 因为我知道你们每天都会遇到很多问题 但我无法弄清楚我的问题 所以我还是问了 这是我们正在做的事情 使用 Python 从 Oracle DB 获取数据并cx Oracle 使用 Python 将数据写入文件 使
  • java为oracle VARCHAR2返回空字符串值

    我有以下代码 它似乎工作正常 但它不显示 personCode 字符串的任何值 PERSON CODE 是 Oracle 9i 数据库中的 VARCHAR2 我在我的项目中使用 Java SE 1 7 和 ojdbc7 jar 我是 Jav
  • 函数参数的自定义惰性求值/短路的语法

    Oracle 定义了几种结构 这些结构利用了看似惰性求值但实际上是短路的功能 例如 x case when 1 2 then count all prime numbers below 100000000 else 2 2 end 函数 c
  • Oracle 函数编译成功,但在执行 PLS-00221 时抛出错误:不是过程或未定义

    我有简单的oracle功能 create or replace function abs test func test in in number return number is test out number BEGIN test out
  • 创建触发器

    如何启动触发器 以便在未付余额超过 50 美元的情况下无人能够租借电影 这里有一个跨行表约束 即你不能只放置一个 OracleCONSTRAINT在列上 因为它们一次只能查看一行中的数据 Oracle 仅支持两种跨 行约束类型 唯一性 例如
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c
  • 如何在不使用 DESCRIBE 命令的情况下描述 Oracle 中的表?

    我在上一门课时遇到了困难 我们需要编写一个 Oracle 脚本 其作用就像 DESCRIBE 命令一样 我们正在使用的这本书对如何使用数据字典的描述非常糟糕 不是寻找答案 而是寻找正确的方向 您正在寻找USER TAB COLUMNS ht

随机推荐

  • 从 HTML
    到 Microsoft Word

    我有一个 HTMLfigure img and figcaption标签 我想将它们转换为 Microsoft Word 文档 所引用的图像img应该插入到Word文档中 并且figcaption应转换为其标题 也保留图号 我尝试用 Wor
  • 如何使用公钥加密字符串并使用私钥解密?

    我想用服务器上的密钥加密密码并在服务器端解密加密的密码 这是我在我的应用程序中使用的代码 To change this license header choose License Headers in Project Properties
  • 增加android模拟器的内存容量?

    如何增加Android模拟器的内存容量 我有一个 16MB 的二进制文件 我必须解析它 但是当我第二次执行时它说 Installation error INSTALL FAILED INSUFFICIENT STORAGE 有人可以帮忙吗
  • 我怎样才能在vim中快速输入像“==========”这样的行

    我正在编辑重组文本文件 我经常需要在一行中放置一些字符 例如 并且我希望该行的长度与前一行匹配 我应该如何在 vim 中执行此操作 a long long title Thanks 另一个可行的方法 yypv r
  • C# FileStream:写入大文件的最佳缓冲区大小?

    假设我正在将几个文件写入磁盘 大小在 2MB 到 5GB 之间 FileStream 的合理缓冲区值是多少 使用几兆字节的缓冲区大小是否明智 或者我应该坚持使用千字节缓冲区 默认缓冲区大小为 4 KiB 另外 请看这里 NET 的顺序文件编
  • NSWidgetExtensionContext openURL Swift

    我一直在尝试实现一个按钮来从其小部件打开我的 iOS 应用程序 我意识到这个问题已经在论坛上被打败了 但我找不到我收到的具体错误的解释 也许你们中一些更有经验的 iOS 开发人员可以对此做出一些解释 我正在使用 XCode 8 1 和 Sw
  • 如何定义类型参数不能为 Any 的 scala 方法

    在下面的示例中 我想定义一个contains无法编译的方法a and b不属于同一基本类型 In contains1暗示 如果a is Seq Int b 是String T导出为Any 并且它可以编译 这不是我想要的 In contain
  • Vim:通过 ssh 访问系统剪贴板 - Linux 到 OS X

    我是 Linux 用户 经常需要通过 SSH 在远程 OS X 服务器上工作 我更喜欢 vim neovim 编辑器 但我在通过 SSH 向系统剪贴板复制 粘贴时遇到问题 当我尝试复制行时 yy它保存在远程 OS X 剪贴板上 有没有办法将
  • 为什么需要使用 docker 将“pam_loginuid”设置为其“可选”值?

    为了运行 ssh 守护进程服务 pam loginuid必须将 etc pam d sshd 中的条目设置为可选 如官方示例适用于 Ubuntu 13 10 对于以前版本的 Ubuntu 此条目是可选的吗 它在 Ubuntu 13 10 之
  • 行尾有“^M”字符

    当我在 Unix 环境中运行特定的 SQL 脚本时 我在 SQL 脚本的每一行末尾看到一个 M 字符 因为它回显到命令行 我不知道 SQL 脚本最初是在哪个 SQL 脚本上创建的 造成这种情况的原因是什么以及如何解决 这是由 DOS Win
  • 如何用分隔符分割 pandas 列并选择首选元素作为替换

    我有以下熊猫数据框 import pandas as pd df pd DataFrame gene 1 foo blabla 2 bar lalala 3 qux trilil 4 woz hohoho cell1 5 9 1 7 cel
  • 操作栏选项卡中的 MapFragment

    我正在尝试构建一个将实现操作栏选项卡的应用程序 其中一个选项卡应包含 MapFragment 如何实现带有选项卡的操作栏 其中一个选项卡下有一个地图片段 你能帮我解决这个问题吗 这是我到目前为止所拥有的 主班 package com nfc
  • Celery:从任务中撤销整个链的干净方法

    我的问题可能非常基本 但我仍然无法在官方文档中找到解决方案 我在 Django 应用程序中定义了一个 Celery 链 执行一组相互依赖的任务 chain tasks apply fetching decision s x y tasks
  • 如何为 Teams 构建 python 机器人?如何在我的 PROD 服务器中部署相同的内容?

    我想用 python 构建一个机器人 我想使用该机器人进行各种休息通话 这可以在 Teams 中完成并部署在 PROD LINUX 服务器中吗 我有 slack 的 python 机器人 工作得很好 为 Microsoft Teams 构建
  • 将 ASP.NET MVC 控制器属性注入到服务层依赖项中?

    我正在使用类似于此中的方法ASP NET MVC 教程你在控制器周围传递一个包装器ModelState集合到验证类中 以便控制器可以访问错误信息 这是一个精心设计的例子 interface IProductValidator void Va
  • 以编程方式关闭Android应用程序[重复]

    这个问题在这里已经有答案了 如何以编程方式关闭我的应用程序 I used finish Or android os Process killProcess android os Process myPid Or System exit 0
  • 是否可以在命令提示符中创建具有多个选项卡的 CSV 文件? [关闭]

    Closed 这个问题是无关 目前不接受答案 我正在创建一个可以在显示 2 个选项卡的 Excel 中打开的 csv 文件 然而 问题是我编写的脚本必须位于批处理文件 命令提示符 中 我在网上看到了一些方法 但它们都是JAVA程序 我不确定
  • 如何在 Selenium 中自动接受 Chrome 的“始终在关联应用程序中打开这些类型的链接”对话框

    我正在使用 Selenium 和 C 进行自动化测试 并且需要从浏览器打开一个外部应用程序 问题是 我总是收到此通知 它会阻止测试执行 有谁知道如何处理这个问题 Chrome 将接受协议处理程序的设置存储在用户配置文件中 从 Seleniu
  • 使用 Cython 包装 C++ 类时处理指针

    我在使用 cython 处理指针时遇到问题 该类的 cython 实现持有一个指向该类的 C 实例的指针Person 这是我的 pyx file 人 pyx cdef class PyPerson cdef Person pointer d
  • PLSQL 中的反思?

    我正在编写一个过程来处理存储在 ANYDATA 中的用户定义对象 对象类型和属性名称只能在运行时知道 因此我无法在声明部分为其定义变量 在Java中 我可以使用反射来处理它 我可以知道类名和字段名 然后我可以通过反射访问这些字段 有没有办法