在 bigquery 中替换 sys_refcursor
Substitute of sys_refcursor in bigquery
在 bigquery 中,我需要将多行的多个列值作为过程中的单个输出参数传递。在 PLSQL 中,它可以通过 sys_refcursor.Is 完成,在 bigquery 中有任何出路。对多行使用以下不 return 值。
CREATE OR REPLACE PROCEDURE `linear-charmer-344806.2143.Test1`(v_name STRING, OUT v_dept STRING,out v_id numeric)
begin
set (v_dept,v_id) =(select as struct dept,roll from `linear-charmer-344806.2143.Employee`
where name = v_name);
end;
我认为您不应该遇到 运行 这样的查询。您只需要注意传递的参数的数据类型和标记变量的名称。关于游标,我认为在 BigQuery 上你可以使用它的替代方法,比如使用 loops,它可以提供一些类似的工作行为。
为了复制您的案例,我执行了以下操作:
CREATE OR REPLACE TABLE `projectid.dataset.table`(
fullVisitorId STRING,
type STRING,
visitId INT64
)
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("4460792451076786377","PAGE",1496345687);
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("8359479821939482641","PAGE",1496356529);
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("9410889263646527987","WEB",1496357061);
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("8801528329001387919","WEB",1496336519);
创建过程
CREATE OR REPLACE PROCEDURE `projectid.dataset.proc_test`(v_visitorid STRING, OUT v_type STRING,OUT v_id numeric)
begin
set (v_type,v_id) =(select as struct type,visitId from `projectid.dataset.table`
where fullVisitorId = v_visitorid);
end;
以这种方式调用过程将用结果填充变量 type
和 id
。
DECLARE type STRING;
DECLARE id numeric;
call `projectid.dataset.proc_test`("4460792451076786377",type,id);
select type,id;
下面,我通过使用 for
脚本语句循环遍历 table
的值,检索 fullVisitorId
并稍后使用它来执行调用到程序。
DECLARE seekerid STRING;
DECLARE out_type STRING;
DECLARE out_id numeric;
FOR record IN
(SELECT fullVisitorId from `projectid.dataset.table`)
DO
SET seekerid = record.fullVisitorId;
call `projectid.dataset.proc_test`(seekerid,out_type,out_id);
select out_type,out_id;
END FOR;
2022 年 3 月 23 日更新: 下面是一个关于如何创建以数组结构变量作为输入的过程的示例。请注意,您必须验证 table 和变量是否适合您的输入和数据结构。
CREATE OR REPLACE PROCEDURE `projectid.dataset.proc_test_struct`(v_inputs ARRAY<STRUCT<type STRING,visitId INT64>>, OUT v_fullVisitorId STRING)
begin
declare v_struct STRUCT<type STRING,visitId INT64>;
set v_struct = (select (type,visitId) from unnest(v_inputs));
set v_fullVisitorId = (select fullVisitorId from `projectid.dataset.table` where type = v_struct.type and visitId = v_struct.visitId);
end;
这是我调用过程并用 struct
变量填充它的部分。
declare v_inputs ARRAY<STRUCT<type STRING,visitId INT64>>;
declare v_fullVisitorId STRING;
set v_inputs = [("PAGE", 1496356529)];
call `projectid.dataset.proc_test_struct`(v_inputs,v_fullVisitorId);
select v_fullVisitorId;
我参考了官方文档,所以如果你想进一步挖掘,你可以查看以下链接:
在 bigquery 中,我需要将多行的多个列值作为过程中的单个输出参数传递。在 PLSQL 中,它可以通过 sys_refcursor.Is 完成,在 bigquery 中有任何出路。对多行使用以下不 return 值。
CREATE OR REPLACE PROCEDURE `linear-charmer-344806.2143.Test1`(v_name STRING, OUT v_dept STRING,out v_id numeric)
begin
set (v_dept,v_id) =(select as struct dept,roll from `linear-charmer-344806.2143.Employee`
where name = v_name);
end;
我认为您不应该遇到 运行 这样的查询。您只需要注意传递的参数的数据类型和标记变量的名称。关于游标,我认为在 BigQuery 上你可以使用它的替代方法,比如使用 loops,它可以提供一些类似的工作行为。
为了复制您的案例,我执行了以下操作:
CREATE OR REPLACE TABLE `projectid.dataset.table`(
fullVisitorId STRING,
type STRING,
visitId INT64
)
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("4460792451076786377","PAGE",1496345687);
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("8359479821939482641","PAGE",1496356529);
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("9410889263646527987","WEB",1496357061);
insert into `projectid.dataset.table`(fullVisitorId,type,visitId)values("8801528329001387919","WEB",1496336519);
创建过程
CREATE OR REPLACE PROCEDURE `projectid.dataset.proc_test`(v_visitorid STRING, OUT v_type STRING,OUT v_id numeric)
begin
set (v_type,v_id) =(select as struct type,visitId from `projectid.dataset.table`
where fullVisitorId = v_visitorid);
end;
以这种方式调用过程将用结果填充变量 type
和 id
。
DECLARE type STRING;
DECLARE id numeric;
call `projectid.dataset.proc_test`("4460792451076786377",type,id);
select type,id;
下面,我通过使用 for
脚本语句循环遍历 table
的值,检索 fullVisitorId
并稍后使用它来执行调用到程序。
DECLARE seekerid STRING;
DECLARE out_type STRING;
DECLARE out_id numeric;
FOR record IN
(SELECT fullVisitorId from `projectid.dataset.table`)
DO
SET seekerid = record.fullVisitorId;
call `projectid.dataset.proc_test`(seekerid,out_type,out_id);
select out_type,out_id;
END FOR;
2022 年 3 月 23 日更新: 下面是一个关于如何创建以数组结构变量作为输入的过程的示例。请注意,您必须验证 table 和变量是否适合您的输入和数据结构。
CREATE OR REPLACE PROCEDURE `projectid.dataset.proc_test_struct`(v_inputs ARRAY<STRUCT<type STRING,visitId INT64>>, OUT v_fullVisitorId STRING)
begin
declare v_struct STRUCT<type STRING,visitId INT64>;
set v_struct = (select (type,visitId) from unnest(v_inputs));
set v_fullVisitorId = (select fullVisitorId from `projectid.dataset.table` where type = v_struct.type and visitId = v_struct.visitId);
end;
这是我调用过程并用 struct
变量填充它的部分。
declare v_inputs ARRAY<STRUCT<type STRING,visitId INT64>>;
declare v_fullVisitorId STRING;
set v_inputs = [("PAGE", 1496356529)];
call `projectid.dataset.proc_test_struct`(v_inputs,v_fullVisitorId);
select v_fullVisitorId;
我参考了官方文档,所以如果你想进一步挖掘,你可以查看以下链接: