select into 時有無strict關鍵字的區別

瀚高PG實驗室發表於2022-04-02

瀚高資料庫
目錄
文件用途
詳細資訊

文件用途
介紹說明在select into語法中有無strict關鍵字的區別。

詳細資訊
一個產生單一行(可能有多個列)的 SQL 命令的結果可以被賦值給一個記錄變數、行型別變數或標量變數行域列表。這通過書寫基礎 SQL 命令並增加一個INTO子句來達成。例如:

SELECT select_expressions INTO [STRICT] target FROM ...;

如果STRICT沒有在INTO子句中被指定,那麼target將被設定為該查詢返回的第一個行,或者在該查詢不返回行時設定為空。第一行之後的任何結果行都會被拋棄。你可以檢查特殊的FOUND變數來確定是否返回了一行:

SELECT * INTO myrec FROM emp WHERE empname = myname;IF NOT FOUND THEN
    RAISE EXCEPTION 'employee % not found', myname;END IF;

如果指定了STRICT選項,該查詢必須剛好返回一行或者將會報告一個執行時錯誤,該錯誤可能是NO_DATA_FOUND(沒有行)或TOO_MANY_ROWS(多於一行)。如果你希望捕捉該錯誤,可以使用一個異常塊,例如:

BEGIN
    SELECT * INTO STRICT myrec FROM emp WHERE empname = myname;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            RAISE EXCEPTION 'employee % not found', myname;
        WHEN TOO_MANY_ROWS THEN
            RAISE EXCEPTION 'employee % not unique', myname;END;

成功執行一個帶STRICT的命令總是會將FOUND置為真。

測試例項:

create table strict_test_tb (id int,content varchar);create or replace function test_no_strict() returns varchar as $$
declare
  param1 strict_test_tb%rowtype;
  begin
 begin
    select * into param1 from strict_test_tb;
    EXCEPTION
  	  WHEN NO_DATA_FOUND THEN
    RAISE EXCEPTION 'param1 % not found', '1';
  	  WHEN TOO_MANY_ROWS THEN
    RAISE EXCEPTION 'param1 % not unique', '2';
      when others then
    RAISE exception 'other unkown exception';  
   end;
   RAISE notice 'param1 is %',param1;
   return null;end;  $$ language plpgsql;    create or replace function test_has_strict() returns varchar as $$
declare
  param1 strict_test_tb%rowtype;begin  
 begin
    select * into strict param1 from strict_test_tb;
    EXCEPTION
  	  WHEN NO_DATA_FOUND THEN
    RAISE EXCEPTION 'param1 % not found', '1';
  	  WHEN TOO_MANY_ROWS THEN
    RAISE EXCEPTION 'param1 % not unique', '2';
  end;
   raise notice 'param1 is %',param1;
   return null;end;$$ language plpgsql;

當沒有資料被返回時:

highgo=# select * from strict_test_tb;
 id | content 
----+---------(0 rows)highgo=# select test_no_strict();NOTICE:  param1 is (,)
 test_no_strict 
---------------- (1 row)highgo=# select test_has_strict();ERROR:  param1 1 not found
CONTEXT:  PL/pgSQL function test_has_strict() line 10 at RAISE

當有一資料被返回時:

highgo=# select test_no_strict();NOTICE:  param1 is (1,1)
 test_no_strict 
---------------- (1 row)highgo=# select test_has_strict();NOTICE:  param1 is (1,1)
 test_has_strict 
-----------------(1 row)

當有多條資料被返回時:

highgo=# select test_no_strict();NOTICE:  param1 is (1,1)
 test_no_strict 
----------------
 (1 row)highgo=# select test_has_strict();ERROR:  param1 2 not unique
CONTEXT:  PL/pgSQL function test_has_strict() line 12 at RAISE

結論:

select into 當沒有資料被返回時,返回null,當有多條資料被返回時,對變數賦值第一條。

select into strict 當沒有資料被返回時,產生no_data_found異常;當有多條資料被返回時,產生too_many_rows異常。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69994931/viewspace-2885541/,如需轉載,請註明出處,否則將追究法律責任。

相關文章