如何使用 plsql 返回多列
Posted
技术标签:
【中文标题】如何使用 plsql 返回多列【英文标题】:How do I return multiple columns using plsql 【发布时间】:2018-06-07 02:15:23 【问题描述】:我有一个受 SAR 保护的 oracle 数据库,我需要从中向 PowerBI 公开一个表。
我不熟悉 PLSQL。
我已设法将表格的一列公开给 PowerBI。
在 2 个方面需要帮助
1) 我需要你们的帮助才能从表格中返回选择性列
2) 我需要你们的帮助才能返回表格中的所有列
DROP TYPE testarr;
CREATE OR REPLACE TYPE testarr IS TABLE OF VARCHAR2(70);
/
GRANT EXECUTE ON testarr TO public;
DROP FUNCTION TestPowerBI
CREATE OR REPLACE FUNCTION TestPowerBI
RETURN testarr AUTHID CURRENT_USER AS
o_recorset SYS_REFCURSOR;
arr testarr := testarr();
pragma autonomous_transaction;
BEGIN
sar.pk_sar_enable_roles.............
commit;
OPEN o_recordset FOR
SELECT NAME FROM vw_people;
FETCH o_recordset BULK COLLECT INTO arr;
CLOSE o_recordset;
RETURN arr;
END TestPowerBI
Grant execute on TestPowerBi to public;
【问题讨论】:
PLSQL 是一种编程语言。你想要的是一个 sql 查询,而不是一个函数。 PowerBi UI 不允许我们通过 SAR 保护数据。这是一个解决方法。有没有办法使用 PLSQL 一起返回 2 列? 让你的函数返回一个游标而不是一个表类型。查看这个问题的答案:***.com/questions/2153053/… 顺便说一句,什么是受 SAR 保护的数据?我做了一个网络搜索,首字母缩写词有很多定义。 现在 PowerBi 状态无法访问非嵌套表项中的行。 Sar 只是在内部提供的用于访问表的安全访问角色 【参考方案1】:您可以创建一个PIPELINED TABLE 函数。
假设这是你的桌子。
create table vw_people ( ID INTEGER, NAME VARCHAR2(10));
INSERT INTO vw_people(id,name) VALUES ( 1,'Knayak');
commit;
创建对象和对象类型的集合
CREATE OR REPLACE TYPE vw_people_typ AS OBJECT( ID INTEGER,NAME VARCHAR2(10));
CREATE OR REPLACE TYPE vw_people_tab AS TABLE OF vw_people_typ;
这是你的功能
CREATE OR REPLACE FUNCTION testpowerbi RETURN vw_people_tab
PIPELINED
AUTHID current_user
AS
vwt vw_people_tab;
PRAGMA autonomous_transaction;
BEGIN
sar.pk_sar_enable_roles;
commit;
SELECT
vw_people_typ(id,name)
BULK COLLECT
INTO vwt
FROM
vw_people;
FOR i IN 1..vwt.count LOOP
PIPE ROW ( vw_people_typ(vwt(i).id,vwt(i).name) );
END LOOP;
END testpowerbi;
/
查询函数的输出为TABLE
select * from TABLE(TestPowerBI);
ID NAME
---------- ----------
1 Knayak
【讨论】:
感谢这在 PLSQL 中运行良好。但 PowerBI 返回“Sql 命令未正确结束”错误以上是关于如何使用 plsql 返回多列的主要内容,如果未能解决你的问题,请参考以下文章
如何从 PLSQL 中的函数返回一组 NUMBERS,然后在 FOR LOOP 中使用它?