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

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

 更新時(shí)間:2026年05月08日 14:56:07   作者:穆金秋  
文章主要介紹了PL/SQL的核心內(nèi)容,包括循環(huán)結(jié)構(gòu)(FOR、WHILE循環(huán)及控制語(yǔ)句)、自定義函數(shù)和存儲(chǔ)過(guò)程,詳細(xì)解釋了各自的特點(diǎn)、應(yīng)用場(chǎng)景和示例,并對(duì)比了函數(shù)和存儲(chǔ)過(guò)程的區(qū)別,特別是強(qiáng)調(diào)了Oracle存儲(chǔ)過(guò)程中的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控制語(yǔ)句;
  2. 自定義函數(shù):強(qiáng)調(diào)必須返回值的特性,演示了數(shù)值計(jì)算和業(yè)務(wù)查詢兩種應(yīng)用場(chǎng)景;
  3. 存儲(chǔ)過(guò)程:側(cè)重?cái)?shù)據(jù)處理流程封裝,對(duì)比了與函數(shù)的關(guān)鍵差異(無(wú)返回值、不可SQL調(diào)用)。

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

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

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

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

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

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

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

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

DECLARE
  X NUMBER := &請(qǐng)輸入數(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é)束條件的場(chǎng)景

示例:輸出 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)控制語(yǔ)句(重要?。?/h3>
關(guān)鍵字作用說(shuō)明
BREAK終止當(dāng)前循環(huán),循環(huán)外代碼繼續(xù)執(zhí)行
CONTINUE跳過(guò)本次循環(huán)剩余代碼,進(jìn)入下一次循環(huán)
RETURN直接結(jié)束整個(gè)程序(循環(huán)外代碼也不執(zhí)行)

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

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

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

特點(diǎn)

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

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

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

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

?? 三、存儲(chǔ)過(guò)程(PROCEDURE)

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

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

特點(diǎn)

  • 沒(méi)有返回值
  • 適合封裝數(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ù)的過(guò)程

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 存儲(chǔ)過(guò)程(面試/考試重點(diǎn))

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

Oracle 存儲(chǔ)過(guò)程 procedure 不允許使用 return 語(yǔ)句

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

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

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

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

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

3. 存儲(chǔ)過(guò)程練習(xí)

-- 創(chuàng)建表 T_NUMBER(ID NUMBER)
-- 創(chuàng)建過(guò)程 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(更高效,但無(wú)法回滾)
        -- 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)用存儲(chǔ)過(guò)程
BEGIN
p_004(100);
END;
select * from T_NUMBER;

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

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

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

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

IS 和 AS 的區(qū)別:

在存儲(chǔ)過(guò)程中,IS 和 AS 完全等價(jià),可以互換使用:

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

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

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

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

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

相關(guān)文章

  • Dbeaver基本使用圖文詳解

    Dbeaver基本使用圖文詳解

    dbeaver是一款很強(qiáng)大的數(shù)據(jù)庫(kù)連接工具,本人之前使用的是navicat,挺好用的,只不過(guò)每次激活都要整半天,然后看到了dbeaver這款工具,本著嘗試的心態(tài),體驗(yàn)了下,真香
    2021-11-11
  • 通過(guò)navicat導(dǎo)入sql文件的操作方法

    通過(guò)navicat導(dǎo)入sql文件的操作方法

    在很多項(xiàng)目當(dāng)中都有sql文件導(dǎo)入到MySQL數(shù)據(jù)庫(kù)的需要,因?yàn)橛衧ql數(shù)據(jù)庫(kù)文件,這個(gè)項(xiàng)目才能正常運(yùn)行起來(lái),那么現(xiàn)在就來(lái)學(xué)習(xí)一下怎么導(dǎo)入sql文件到navicat里面吧,需要的朋友可以參考下
    2024-03-03
  • SQL查詢的底層運(yùn)行原理深入分析

    SQL查詢的底層運(yùn)行原理深入分析

    這篇文章主要給大家介紹了關(guān)于SQL查詢的底層運(yùn)行原理,文中通過(guò)實(shí)例代碼結(jié)束的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 用戶管理的備份(一致性備份、非一致性備份、脫機(jī)備份、聯(lián)機(jī)備份)

    用戶管理的備份(一致性備份、非一致性備份、脫機(jī)備份、聯(lián)機(jī)備份)

    用戶管理的備份(一致性備份、非一致性備份、脫機(jī)備份、聯(lián)機(jī)備份)說(shuō)明文檔。
    2009-05-05
  • 淺談為什么數(shù)據(jù)庫(kù)字段建議設(shè)置為NOT NULL

    淺談為什么數(shù)據(jù)庫(kù)字段建議設(shè)置為NOT NULL

    本文主要介紹了MySQL數(shù)據(jù)庫(kù)中將字段設(shè)置為NOT NULL的性能和優(yōu)缺點(diǎn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 利用DataSet部分功能實(shí)現(xiàn)網(wǎng)站登錄

    利用DataSet部分功能實(shí)現(xiàn)網(wǎng)站登錄

    這篇文章主要介紹了利用DataSet部分功能實(shí)現(xiàn)網(wǎng)站登錄 ,需要的朋友可以參考下
    2017-05-05
  • sql語(yǔ)句中where 1=1的作用

    sql語(yǔ)句中where 1=1的作用

    在看程序時(shí)時(shí),發(fā)現(xiàn)基本只要是拼湊的SQL語(yǔ)句,基本上都會(huì)這樣寫:
    2008-08-08
  • 淺談一下數(shù)據(jù)庫(kù)系統(tǒng)的發(fā)展與組成

    淺談一下數(shù)據(jù)庫(kù)系統(tǒng)的發(fā)展與組成

    這篇文章主要介紹了淺談一下數(shù)據(jù)庫(kù)系統(tǒng)的發(fā)展與組成,數(shù)據(jù)庫(kù)系統(tǒng),指在計(jì)算機(jī)系統(tǒng)中引入數(shù)據(jù)庫(kù)后的系統(tǒng),一般由數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)、應(yīng)用系統(tǒng)、數(shù)據(jù)庫(kù)管理員(DBA)構(gòu)成,本文就數(shù)據(jù)庫(kù)的發(fā)展展開(kāi)詳細(xì)講解
    2023-07-07
  • DBeaver復(fù)制數(shù)據(jù)庫(kù)圖文教程(數(shù)據(jù)庫(kù)表結(jié)構(gòu)以及內(nèi)容)

    DBeaver復(fù)制數(shù)據(jù)庫(kù)圖文教程(數(shù)據(jù)庫(kù)表結(jié)構(gòu)以及內(nèi)容)

    DBeaver提供一個(gè)圖形界面用來(lái)查看數(shù)據(jù)庫(kù)結(jié)構(gòu)、執(zhí)行SQL查詢和腳本,下面這篇文章主要給大家介紹了關(guān)于DBeaver復(fù)制數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)表結(jié)構(gòu)以及內(nèi)容)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • sql 中將日期中分秒化為零的語(yǔ)句

    sql 中將日期中分秒化為零的語(yǔ)句

    用到了sql中的convert函數(shù)將日期中的分秒轉(zhuǎn)換為零
    2008-10-10

最新評(píng)論

来安县| 融水| 安国市| 唐河县| 大埔区| 临清市| 黎平县| 玉门市| 额济纳旗| 开阳县| 泌阳县| 全椒县| 桃园市| 贵南县| 镇远县| 驻马店市| 太和县| 大同县| 河津市| 稻城县| 辰溪县| 格尔木市| 平潭县| 高清| 华安县| 土默特右旗| 岗巴县| 五莲县| 古浪县| 黄大仙区| 大连市| 凉山| 时尚| 敦化市| 营山县| 旬阳县| 海兴县| 东阿县| 永吉县| 栾川县| 将乐县|