1. 程式人生 > >Oracle資料庫(十)——儲存過程上

Oracle資料庫(十)——儲存過程上

儲存過程

建立儲存過程

CREATE PROCEDURE TEST
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('我的第一個過程!');
END;
--執行
--SERVEROUTPUT設定,想讓DBMS_OUTPUT.PUT_LINE成功輸出,需要把SERVEROUTPUT選項設定為ON的狀態
SHOW SERVEROUTPUT
SET SERVEROUTPUT ON 
BEGIN 
    TEST;
END;
--還具體在關鍵詞EXEC後面加上儲存過程名來執行以及存在的儲存過程

檢視儲存過程

SELECT * FROM USER_SOURCE WHERE NAME= 'TEST' ORDER BY LINE ;
--從檢視USER_SOURCE中查詢過程或函式時需要把名稱大寫

--檢視儲存過程TEST_ERR的錯誤
SHOW ERRORS PROCEDURE TEST_ERR;

無參儲存過程

無參儲存過程就是建立的儲存過程不帶任何引數,通常這種儲存過程用做資料轉換的機率比較大。

--把表productinfo中價格最低的3件產品的desperation欄位設定為’促銷商品‘
CREATE PROCEDURE PRODUCT_UPDATE_PRC
AS
BEGIN 
UPDATE PRODUCTINFO SET DESPERATION = '促銷產品'
WHERE PRODUCTID IN
(
  SELECT PRODUCTID FROM
  ( SELECT * FROM PRODUCTINFO ORDER BY PRODUCTPRICE ASC )
  WHERE ROWNUM < 4
);
COMMIT;
END;

儲存過程中使用遊標

--要求把productinfo表中資料根據不同的產品型別分類把資料輸出到螢幕
CREATE PROCEDURE PRODUCT_CUR_PRC
AS
cur_ctgy productinfo.category%TYPE;
cur_ctgyname categroyinfo.categroyname%TYPE;
cur_prtifo productinfo%ROWTYPE;

CURSOR cur_category
IS 
SELECT CATEGORY FROM PRODUCTINFO GROUP BY CATEGORY;

BEGIN 
    OPEN cur_category;
    LOOP
        FETCH cur_category;
        EXIT WHEN cur_category%NOTFOUND;
            SELECT CATEGORYINFO.CATEGROYNAME INTO cur_ctgyname
            FROM CATEGROYINFO
            WHERE CATEGROYID = cur_ctgy;
                IF SQL%FOUND THEN
                    DBMS_OUTPUT.PUT_LINE('---------------');
                    DBMS_OUTPUT.PUT_LINE(cur_ctgyname || ':');
                END IF;

            FOR my_prdinfo_rec IN
            (
                SELECT * FROM PRODUCTINFO WHERE CATEGORY = cur_ctgy
            )
                LOOP
                 DBMS_OUTPUT.PUT_LINE(
                                    '產品名稱: ' || my_prdinfo_rec.PRODUCTNAME|| '產品價格: ' || my_prdinfo_rec.PRODUCTPRICE|| '產品數量:' || my_prdinfo_rec.QUANTITY
                                      );
                END LOOP;
        END LOOP;
    CLOSE cur_category;
END ;

儲存過程中的DDL語句

有時候我們會在操作資料的時候使用臨時表,而為了讓儲存過程根據有通用性,可以選擇把建立臨時表的步驟一併放到過程裡。這樣的操作會和前面介紹的兩種示例寫法有所不同,它會用到EXECUTE IMMEDIATE語句,儲存過程中會使用它來執行DDL語句和動態SQL語句

--要求把各種不同型別的產品中價格最低的輸入到臨時表PRODUCTINFO_TMP(此表需要建立)中,並在其中DESPERATION欄位註明“熱銷商品“,如果記錄中價格低於20則表示資料有問題,需要輸出到螢幕

CREATE PROCEDURE PRODUCT_TMEP_UPDATE_PRC
AS

pc_delestr  VARCHAR2(50);
pc_createstr    VARCHAR2(500);
pc_insrtstr VARCHAR2(500);
tabext VARCHAR2(10); --判斷臨時表是否存在中間變數

cur_ctgy productinfo.Category%TYPE;
cur_prtifo productinfo%ROWTYPE;

CURSOR cur_category
IS
SELECT CATEGORY FROM PRODICTINFO GROUP BY CATEGORY;

CURSOR cur_proinfo(ctgy varchar)
IS
SELECT * FROM 
(SELECT * FROM PRODUCTINFO WHERE CATEGORY = ctgy ORDER BY PRODUCTPRICE ASC)
WHERE ROWNUM < 2;

BEGIN 
    SELECT COUNT(1)INTO tabext
    FROM ALL_TABLES
    WHERE TABLE_NAME = 'PRODUCTINFO_TMP'

    pc_delestr:= 'DELECTE FROM PRODUCTINFO_TMP'

    pc_createstr := 'CREATE GLOBAL TEMPORARY TABLE PRODUCTINFO_TMP
    (
        PRODUCTID VARCHAR2(10) NOT NULL,
        PRODUCTNAME VARCHAR2(20),
        PRODUCTPRICE NUMBER(8,2),
        QUANTITY NUMBER(10),
        CATEGORY VARCHAR2(10),
        DESPERATION VARCHAR2(1000),
        ORIGIN  BARCHAR2(10)
    )On Commit Preserve Rows';

     if tabext=0 then  --不存在就建立一個
        EXECUTE IMMEDIATE pc_createrstr;
        DBMS_OUTPUT.PUT_LINE('建立臨時表成功');
      else
        EXECUTE IMMEDIATE pc_delestr;
        DBMS_OUTPUT.PUT_LINE('刪除記錄完成');
      end if;

    OPEN cur_category;
    LOOP
      FETCH cur_category INTO cur_ctgy;
      EXIT WHEN cur_category%NOTFOUND;
            OPEN cur_proinfo(cur_ctgy);
                FETCH cur_proinfo INTO cur_prtifo;
                IF cur_proinfo%FOUND THEN
                    IF cur_prtifo.PRODUCTPRICE < 20 THEN --產品價格低於20的打印出來
                        DBMS_OUTPUT.PUT_LINE('產品ID:'||cur_prtifo.PRODUCTID||'產品名稱:' ||cur_prtifo.PRODUCTNAME||' 產品價格:' || cur_prtifo.PRODUCTPRICE
                    );
                    ELSE    --非低於20價格的產品輸入到臨時表 
                    EXECUTE IMMEDIATE 'INSERT INTO PRODUCTINFO_TMP(PRODUCTID,PRODUCTNAME.PRODUCTPRICE,QUANTITY,CATEGORY,DESPERATION,ORIGIN) VALUES (...||cur_prtifo.PRODUCTID||...,...||cur_prtifo.PRODUCTNAME||...,...||cur_prtifo.PRODUCTPRUCE||...,...||cur_prtifo.QUANTITY||...,...||cur_prtifo.CATEGORY||...,...||cur_prtifo.DESPERATION||...,...||cur_prtifo.ORIGIN||...)';
                    END IF;
                END IF;
            CLOSE cur_proinfo;
        END LOOP;
            COMMIT;
        CLOSE cur_category;
        EXECUTE IMMEDIATE 'UPDATE PRODUCTINFO_TMP SET DESPERATION = ''熱銷商品''',
     END;

相關推薦

Oracle資料庫()——儲存過程

儲存過程 建立儲存過程 CREATE PROCEDURE TEST AS BEGIN DBMS_OUTPUT.PUT_LINE('我的第一個過程!'); END; --執行 --SERVEROUTPUT設定,想讓DBMS_OUTPUT.PUT_LIN

使用JavaScript和Python實現Oracle資料庫儲存過程

本文研究了多語言引擎(MLE)如何在GraalVM的幫助下在Oracle資料庫中使用JavaScript和Python,為資料密集型計算帶來巨大的生態系統。使用GraalVM,我們不僅可以快速將新語言引入Oracle資料庫,而且還可以輕鬆獲得高效能的推測JIT編譯器。它可用於為查詢的關鍵部分生成有效

C#連線Oracle資料庫通過儲存過程操作資料庫

之前筆者一直用C#連線SQL Server資料庫。近期由於工作需要,需要用C#連線Oracle資料庫,並且要通過儲存過程,來操作資料庫中的資料,實現增、刪、改、查(有分頁功能)功能。並且,為了今後對資料庫擴充套件方便,對現在的程式碼改動最小的情況下,實現資料庫的平穩切換,必須

初學mysql()-資料庫儲存過程、函式與遊標-自定義函式和流程控制(下)

上一篇部落格講了儲存過程、函式、以及遊標,這一篇部落格接著上一篇部落格來說。首先說說mysql資料庫中的流程控制及自定義函式的使用。 自定義函式: 根據所需要的功能,使用流程控制來完成所需要的功能,完成功能的程式碼就稱為自定義函式。要想完成自定義函式就必須學會流程控制的使

oracle查詢資料庫儲存過程、索引、檢視等的數量

select count(1) from user_objects where object_type = 'PROCEDURE' select count(1) from user_objects where object_type = 'INDEX' select co

Oracle資料庫(五)——事務和鎖——確保資料安全

事務和鎖是兩個聯絡非常緊密的概念,它們保證了資料庫的一致性。由於資料庫是一個可以由多個使用者共享的資源,因此當多個使用者併發的存取資料時,就要保證資料的準確性。事務和鎖就完成了這項功能。 什麼是事務 事務在資料庫中主要用於保證資料的一致性,防止出現錯誤資

Oracle中的儲存過程簡單例子

---建立表 create table TESTTABLE (   id1  VARCHAR2(12),   name VARCHAR2(32) ) select t.id1,t.name from TESTTABLE t insert into TESTTABLE

Oracle資料庫——基本使用《

1、【使用者操作】 --建立表空間 create tablespace mollen datafile 'c:\myorcldb\mollen' size 100m autoextend on next 10m; --刪除表空間 drop tablespace mollen

測試技能:在oracle中自用儲存過程進行測試資料構造

一、實踐 –迴圈賦值 declare i integer; –定義變數 begin i := 101; loop /* 插入資料 */ insert into emp (EMP_ID, E_ID, UM_ID, NAME, BIRTHDAY, A

Oracle資料庫的啟動過程

[email protected] zxy>startup ORACLE instance started. Total System Global Area 830930944 bytes Fixed Size 2232

Oracle資料庫的安裝過程

Oracle再使用的時候不收費。 內容分為兩大部分:開發部分,管理部分 安裝: 以Oracle 11g為例 解壓合併後點擊setup.exe ——出現了狀態:[INS-13001] 環境不滿足最低要求。         -我給忽略了,選擇了“是”,還不知道有沒有什

MySQL資料庫儲存過程

儲存過程(Stored Procedure):一組可程式設計的函式,是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。 為什麼

利用資料庫儲存過程生成java的formbean物件

根據表名生成相應的javabean,欄位都是字串的 --執行過程 begin   -- Call the procedure   prc_common_formbean(ps_projec

資料庫儲存過程

1.http://blog.sina.com.cn/s/blog_76b2c4810101b8qz.html 將常用的或很複雜的工作,預先用SQL語句寫好並用一個指定的名稱儲存起來, 那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫execute,

oracle 自定義儲存過程

語法 建立 TYPE 型別 atrr_type CREATE OR REPLACE TYPE atrr_type AS OBJECT ( attrId varchar2(40),

MY-SQL-----資料庫---索引---儲存過程(後)

   索引 索引是一種特殊的檔案,它們包含著對資料表裡所有記錄的引用指標。 它是對資料庫表中一列或多列的值進行排序的一種結構。 簡單理解 資料庫索引好比是一本書前面的目錄,能夠加快資料庫的查詢速度, 資料庫索引就是為了提高表的搜尋效率而對某些欄位中的值建立的目錄。 建立

Oracle中建立儲存過程和呼叫過程(一)

1、定義         所謂儲存過程(Stored Procedure),就是一組用於完成特定資料庫功能的SQL語句集,該SQL語句集經過 編譯後儲存在資料庫系統中。在使用時候,使用者通過指定已經定義的儲存過程名字並給出相應的儲存過程引數 來呼叫並執行

Oracle資料庫SQL語句(

一、 建立表空間 create tablespace itheima datafile 'C:\itheima.dbf' size 100m autoextend on next 10m; 二、 建立使用者 create user itshunzi ident

MySQL資料庫儲存過程儲存函式

1 引言         儲存過程和儲存函式類似於面向物件程式設計語言中的方法,可以簡化程式碼,提高程式碼的重用性。本文主要介紹如何建立儲存過程和儲存函式,以及儲存過程與函式的使用、修改、刪除等操作。 2 儲存過程與儲存函式     MySQL中提供儲存過程與儲存

Oracle 函式和儲存過程的區別和聯絡 總結版

  oracle儲存過程與函式的區別 2017年08月15日 22:49:38 冷月葬花魂iiii 閱讀數:7800更多 個人分類: oracle 定義: 儲存過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集