最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PL/SQL?循環(huán)、自定義函數(shù)以及存儲過程實例詳解

 更新時間:2026年05月08日 14:56:07   作者:穆金秋  
文章主要介紹了PL/SQL的核心內(nèi)容,包括循環(huán)結(jié)構(gòu)(FOR、WHILE循環(huán)及控制語句)、自定義函數(shù)和存儲過程,詳細(xì)解釋了各自的特點、應(yīng)用場景和示例,并對比了函數(shù)和存儲過程的區(qū)別,特別是強(qiáng)調(diào)了Oracle存儲過程中的IS/AS關(guān)鍵字的必要性

本文系統(tǒng)梳理了PL/SQL三大核心內(nèi)容:

  1. 循環(huán)結(jié)構(gòu):包括FOR循環(huán)(固定次數(shù))、WHILE循環(huán)(條件判斷)及BREAK/CONTINUE控制語句;
  2. 自定義函數(shù):強(qiáng)調(diào)必須返回值的特性,演示了數(shù)值計算和業(yè)務(wù)查詢兩種應(yīng)用場景;
  3. 存儲過程:側(cè)重數(shù)據(jù)處理流程封裝,對比了與函數(shù)的關(guān)鍵差異(無返回值、不可SQL調(diào)用)。

特別指出存儲過程中IS/AS關(guān)鍵字不可省略的語法要求,并提供了典型練習(xí)案例(質(zhì)數(shù)判斷、字符串處理等)。

適用于數(shù)據(jù)庫開發(fā)人員快速掌握PL/SQL編程要點。

?? 一、循環(huán)結(jié)構(gòu)

1. FOR 循環(huán)(最常用)

FOR I IN 起始值..結(jié)束值 LOOP
  循環(huán)體;
END LOOP;
  • I 自動從起始值遞增到結(jié)束值,步長為 1
  • 適合已知循環(huán)次數(shù)的場景

for 循環(huán)的步長固定為1,不能更改。

在 PL/SQL 的 FOR 循環(huán)中,起始值..結(jié)束值 是一個閉區(qū)間,循環(huán)變量 I 會從起始值一直遍歷到結(jié)束值,包括結(jié)束值本身

示例:判斷質(zhì)數(shù)

DECLARE
  X NUMBER := &請輸入數(shù)值;
  V_FLAG NUMBER := 0;
BEGIN
  FOR I IN 2..X-1 LOOP
    IF MOD(X, I) = 0 THEN
      V_FLAG := 1;
    END IF;
  END LOOP;
  ...
END;

示例:99 乘法表

DECLARE
  V_STR VARCHAR2(100);
BEGIN
  FOR I IN 1..9 LOOP
    V_STR := '';
    FOR J IN 1..I LOOP
      V_STR := V_STR || I || ' * ' || J || ' = ' || I*J || ' ';
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(V_STR);
  END LOOP;
END;

2. WHILE 循環(huán)

WHILE 條件 LOOP
  循環(huán)體;
  變量自增/自減;
END LOOP;
  • 適合未知循環(huán)次數(shù),但知道結(jié)束條件的場景

示例:輸出 1~100 奇數(shù)

DECLARE
  V_NUM NUMBER := 1;
BEGIN
  WHILE V_NUM <= 100 LOOP
    IF MOD(V_NUM,2) = 1 THEN
      DBMS_OUTPUT.PUT_LINE(V_NUM);
    END IF;
    V_NUM := V_NUM + 1;
  END LOOP;
END;

3. 循環(huán)控制語句(重要?。?/h3>
關(guān)鍵字作用說明
BREAK終止當(dāng)前循環(huán),循環(huán)外代碼繼續(xù)執(zhí)行
CONTINUE跳過本次循環(huán)剩余代碼,進(jìn)入下一次循環(huán)
RETURN直接結(jié)束整個程序(循環(huán)外代碼也不執(zhí)行)

?? 二、自定義函數(shù)(FUNCTION)

語法結(jié)構(gòu)

CREATE OR REPLACE FUNCTION 函數(shù)名(入?yún)⒚?參數(shù)類型)
RETURN 返回值類型
IS
  變量聲明;
BEGIN
  邏輯體;
  RETURN 結(jié)果;
END;

特點

  • 必須有返回值
  • 入?yún)⒑头祷刂殿愋?strong>不能定義長度
  • 適合封裝常用計算邏輯

示例:模擬 ABS 函數(shù)

CREATE OR REPLACE FUNCTION ABS_BAK(P_NUM NUMBER)
RETURN NUMBER
IS
BEGIN
  RETURN REPLACE(P_NUM, '-');
END;

示例:根據(jù)員工編號返回姓名(帶錯誤處理)

?? 三、存儲過程(PROCEDURE)

語法結(jié)構(gòu)

CREATE OR REPLACE PROCEDURE 過程名(入?yún)⒚?參數(shù)類型)
IS
  變量聲明;
BEGIN
  -- 數(shù)據(jù)同步、清洗、處理流程
END;

特點

  • 沒有返回值
  • 適合封裝數(shù)據(jù)處理流程(如 ETL)

示例:同步部門最高薪資

CREATE OR REPLACE PROCEDURE P_001
IS
BEGIN
  DELETE FROM H_SAL_EMP;
  INSERT INTO H_SAL_EMP
  SELECT DEPTNO, MAX(SAL) FROM EMP GROUP BY DEPTNO;
  COMMIT;
END;

調(diào)用方式

BEGIN
  P_001;
END;

示例:帶參數(shù)的過程

CREATE OR REPLACE PROCEDURE P_002(C_JOB VARCHAR2)
IS
BEGIN
  DELETE FROM EMP_J WHERE JOB = C_JOB;
  INSERT INTO EMP_J SELECT * FROM EMP WHERE JOB = C_JOB;
  COMMIT;
END;

?? 四、函數(shù) vs 存儲過程(面試/考試重點)

對比項函數(shù)(FUNCTION)存儲過程(PROCEDURE)
返回值必須有沒有
語法關(guān)鍵字FUNCTIONPROCEDURE
使用場景計算并返回一個值封裝數(shù)據(jù)同步、處理流程
能否在 SQL 中直接調(diào)用? 可以(如 SELECT 函數(shù)名()? 不可以
是否必須有 RETURN? 是? 否

Oracle 存儲過程 procedure 不允許使用 return 語句

? 典型練習(xí)題(建議手動敲一遍)

1. 循環(huán)練習(xí)

  • 使用 FOR / WHILE 計算 1~200 之間所有偶數(shù)的和
  • 打印 1~X 之間所有的質(zhì)數(shù)

2. 函數(shù)練習(xí)

-- 實現(xiàn) ELIM 函數(shù):刪除字符串中第一次出現(xiàn)的指定字符
-- 示例:ELIM('A-B-C', '-') → 'AB-C'

3. 存儲過程練習(xí)

-- 創(chuàng)建表 T_NUMBER(ID NUMBER)
-- 創(chuàng)建過程 P_004(X),將比 X 小的所有奇數(shù)插入 T_NUMBER
create TABLE T_NUMBER(
ID NUMBER
);
commit;
CREATE OR REPLACE PROCEDURE p_004(x NUMBER)
      IS
      BEGIN
        -- 清空表格
        DELETE FROM T_NUMBER;
        COMMIT;
        -- 或者使用 TRUNCATE(更高效,但無法回滾)
        -- EXECUTE IMMEDIATE 'TRUNCATE TABLE T_NUMBER';
        for i in 1..x-1 loop
            if mod(i,2)=1
            then
            INSERT INTO T_NUMBER(ID) VALUES (i);
            end if;
        end loop;
        COMMIT;
      END;
-- 調(diào)用存儲過程
BEGIN
p_004(100);
END;
select * from T_NUMBER;

補(bǔ)充:IS可以省略不寫嗎

在 Oracle 存儲過程中,IS(或 AS)是必須的,不能省略。

存儲過程的基本語法結(jié)構(gòu):

CREATE OR REPLACE PROCEDURE 過程名(參數(shù))
IS      -- 或 AS,必須存在,不能省略
BEGIN
    -- 過程體
END;
/

IS 和 AS 的區(qū)別:

在存儲過程中,IS 和 AS 完全等價,可以互換使用:

-- 使用 IS
CREATE OR REPLACE PROCEDURE p_004(x NUMBER) 
IS
BEGIN
    -- 邏輯
END;
-- 使用 AS(同樣正確)
CREATE OR REPLACE PROCEDURE p_004(x NUMBER) 
AS
BEGIN
    -- 邏輯
END;

為什么不能省略?

IS/AS 的作用是:

  • 標(biāo)記聲明部分的開始(用于聲明變量、游標(biāo)等)
  • 分隔過程頭部和主體
  • 語法規(guī)定的必需關(guān)鍵字
-- 錯誤示范(缺少 IS/AS)
CREATE OR REPLACE PROCEDURE p_004(x NUMBER)  -- 編譯錯誤!
BEGIN
    NULL;
END;

對比其他數(shù)據(jù)庫:

數(shù)據(jù)庫語法IS/AS 是否必需
OracleIS 或 AS必需
SQL ServerAS必需
PostgreSQLAS必需(但寫法不同)
MySQL不需要不需要

總結(jié):在 Oracle 中創(chuàng)建存儲過程,IS 或 AS 是必需的關(guān)鍵字,不能省略。如果沒有任何變量聲明,可以在 IS 后直接寫 BEGIN。

到此這篇關(guān)于PL/SQL 循環(huán)、自定義函數(shù)以及存儲過程實例詳解的文章就介紹到這了,更多相關(guān)PL/SQL 循環(huán) 自定義函數(shù)存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

武穴市| 卢龙县| 伊春市| 西和县| 漳平市| 饶平县| 吉林省| 遂宁市| 商河县| 潞西市| 神池县| 漳平市| 稻城县| 鄯善县| 娄烦县| 云浮市| 日土县| 偏关县| 安图县| 富阳市| 鹰潭市| 莱阳市| 乐陵市| 黑龙江省| 沙田区| 彭州市| 双桥区| 青神县| 新乡县| 西平县| 北安市| 百色市| 陆丰市| 嘉荫县| 波密县| 商河县| 巨鹿县| 德州市| 临漳县| 乐安县| 新田县|