如何在 oracle 中使用动态 sql 创建记录类型?

Posted

技术标签:

【中文标题】如何在 oracle 中使用动态 sql 创建记录类型?【英文标题】:how to create record type using dynamic sql in oracle? 【发布时间】:2017-07-11 14:36:36 【问题描述】:

我有一个名为 a 的表,其中包含 x 列。

create table A (x varchar2(4000));

insert into A values ('select p,q,r from o');
commit;

现在我想在上面的sql的基础上动态创建一个记录类型,即

TYPE rc IS RECORD ( p o.p%type,
                    q o.q%type,  
                    r o.r%type);

请告诉我如何在运行时创建上述记录。

如果不可能,请提出任何解决方法。

谢谢。

【问题讨论】:

请修改您的帖子以包含至少一个对“论坛”的引用。有关如何在帖子中创建链接的更多详细信息,请参阅this。 @jeff6times7 这是随机论坛,我之前关闭了这些页面并错过了这些 URL。 你能发布一个伪代码来演示你想要实现的目标吗? @XING 请查看更新后的帖子。我希望它会有所帮助 你需要的是方法4动态SQL。 Adrian Billington 就该主题写了一篇出色的文章check it out 【参考方案1】:

如果你只想在你的代码中使用这个表的记录,你不需要创建一个类型,你可以声明一个 rowtype 变量如下

CREATE TABLE xx_emp (emp_id NUMBER, emp_name VARCHAR2(100));

DECLARE

  l_emp_type  xx_emp%ROWTYPE;

BEGIN

  l_emp_type.emp_id   := 10;
  l_emp_type.emp_name := 'JOE';

END;

【讨论】:

查询也可能与另一个表有连接,并且在选择中有额外的列。在这种情况下,它不会起作用。这就是我动态请求的原因。 如果它将使用带有连接的查询,我建议您使用游标,【参考方案2】:

正如您对上一个答案的评论,我将假设“动态地”您希望基于可能包含连接的查询来创建它,

你可以像下面这样使用光标

  DECLARE
  -- here you declare a cursor named c_cursor_name
  CURSOR c_cursor_name IS SELECT a.emp_name  
                               , b.dept_name 
                            FROM xx_emp  a
                               , xx_Dept b
                           WHERE a.dept_id = b.dept_id;

  -- here you can declare your record based on your cursor
  r_recors_type   c_cursor_name%ROWTYPE;

BEGIN

  -- now you can fill your cursor as you want
  r_recors_type.emp_name := 'JOE';
  r_recors_type.dept_name := 'Marketing';


END;

【讨论】:

谢谢。但它也不适用于我的情况。目前我正在使用 DBMS_SQL 包来解决这个问题。我即将完成它。完成后将在此处发布,我是如何做到的。

以上是关于如何在 oracle 中使用动态 sql 创建记录类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中

如何根据表名作为输入在 PL/Sql 中动态创建记录

如何使用 pl sql 过程从结构仅在运行时知道的 oracle 表中动态获取数据?

oracle 在存储过程中用动态sql创建序列为何会遇到权限不足的问题呢?

如何查询oracle数据库的操作记录?

如何在 LINQ SQL C# 中返回动态周数?