如何在 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 过程从结构仅在运行时知道的 oracle 表中动态获取数据?