IBM DB2 SQL PL中“设置”和“选择到”之间的差异

vzgqcmou  于 2022-11-07  发布在  DB2
关注(0)|答案(4)|浏览(182)

在SQL PL中进行开发时,'set'和'select into'之间有什么区别?

set var = (select count(1) from emp);

select count(1) into var from emp;

它们完全等同吗?我在哪里可以找到关于它们的文档?

mbyulnm0

mbyulnm01#

当发出select时,它不返回任何值:

  • select into引发异常
  • set获取空值

您可以使用以下两个存储过程检查差异:
使用设定:

create or replace procedure test1 (
in name varchar(128)
)
begin
 declare val varchar(128);

 set val = (select schemaname
   from syscat.schemata where schemaname = name);
end @

使用select into

create or replace procedure test2 (
in name varchar(128)
)
begin
 declare val varchar(128);

 select schemaname into val
   from syscat.schemata where schemaname = name;
end @

呼叫设置

$ db2 "call test1('nada')"

  Return Status = 0

调用选择到

$ db2 "call test2('nada')"

  Return Status = 0

SQL0100W  No row was found for FETCH, UPDATE or DELETE; or the result of a 
query is an empty table.  SQLSTATE=02000

这是两者之间的区别,当使用select into时,你必须处理处理程序。

bhmjp9jg

bhmjp9jg2#

据我所知,他们是
在某些情况下,你会做一个技术超过另一个。
例如,不能在SET中使用WITH UR
SET var1=(从t中选择....,带ur)
但能做

select a into var1 from t with ur
cs7cruho

cs7cruho3#

当查询结果是测试条件的一部分时。
例如,当分离分区并等待异步进程时,将执行以下操作:

WHILE (STATUS_PART <> '') DO
  CALL DBMS_LOCK.SLEEP(1);
  SET STATUS_PART = (SELECT STATUS
    FROM SYSCAT.DATAPARTITIONS
    WHERE TABSCHEMA = TABLE_SCHEMA
    AND TABNAME = TABLE_NAME
    AND DATAPARTITIONNAME LIKE 'SQL%' WITH UR);
 END WHILE;

但以下情况则不然:

WHILE (STATUS_PART <> '') DO
  CALL DBMS_LOCK.SLEEP(1);
  SELECT STATUS INTO STATUS_PART 
    FROM SYSCAT.DATAPARTITIONS
    WHERE TABSCHEMA = TABLE_SCHEMA
    AND TABNAME = TABLE_NAME
    AND DATAPARTITIONNAME LIKE 'SQL%' WITH UR;
 END WHILE;
x8diyxa7

x8diyxa74#

SELECT INTO适用于SELECT语句。
使用SET,您可以直接分配函数的结果,进行计算或分配不同的变量。例如:

SET var = var + 1;
SET var1 = var;

相关问题