1. 程式人生 > >oracle之儲存過程,臨時表,遊標示例

oracle之儲存過程,臨時表,遊標示例

總結如下:
DDL是一種消耗資源非常大的操作,執行時儘量不要使用DDL語句,應用程式需要的臨時表應在執行之前就開始建立。不必在每個儲存過程中建立一次。臨時表總是存在的,他們作為物件存在於資料字典中,並且總是保持為空,直到有會話在其中放入資料
1 建立臨時表
Sql程式碼 
create global temporary table 表名 

  ID               VARCHAR2(100 CHAR), 
  NAME         VARCHAR2(100 CHAR)  

on commit preserve rows; 

2 建立儲存過程
Sql程式碼 
create or replace procedure proc_XXX( 
mycur out SYS_REFCURSOR 
as 
TYPE My_CurType IS REF CURSOR; 
CUR_1 My_CurType; 
tempa varchar2; 
tempb varchar2; 
--此處可宣告更多變更^_^ 
begin 
  
    OPEN CUR_1 FOR  select * from 表名; 
   
    --使用前先清空 
    execute immediate 'truncate table  臨時表表名'; 
 
  LOOP 
  FETCH CUR_1 INTO  tempa; 
  EXIT WHEN CUR_1%NOTFOUND; 
     
      --進行相關的業務查詢,將結果返回於更多變數上,插入臨時表資料       
     tempa:='1'; 
     tempb:='jack'; 
     insert into 臨時表表名(ID,NAME)values(tempa,tempb);  
     commit;   
end loop;     
  open mycur for  select * from  臨時表表名;       
  CLOSE  CUR_1; 
  message :='查詢臨時表成功'; 
  EXCEPTION 
  WHEN OTHERS THEN 
   message :='查詢臨時表失敗'; 
end  proc_XXX; 

參考更多
1 建立臨時表,插入資料,返回結果集
Sql程式碼 
CREATE OR REPLACE PROCEDURE Report_Month_Responsibility( 
 o_cur OUT SYS_REFCURSOR 

IS 
STR VARCHAR2(200); 
tb_count INT; 
BEGIN 
  --先判斷全域性臨時表是否存在,沒存在則重新建立: 
  select count(*) into tb_count from dba_tables where table_name='REPROTTEST'; 
  if tb_count=0 then 
    STR:=' CREATE GLOBAL TEMPORARY TABLE REPROTTEST( 
           ID INT, 
           ANAME VARCHAR2(20) 
    ) ON COMMIT PRESERVE ROWS'; 
     execute immediate STR; 
  end if; 
   
  STR:='INSERT INTO REPROTTEST(ID,ANAME)  VALUES(1,''1'')'; 
  execute immediate STR; 
  COMMIT; 
  STR:='SELECT * FROM REPROTTEST'; 
  OPEN o_cur FOR STR; -- 給遊標變數賦值 
END Report_Month_Responsibility; 

2 呼叫儲存過程
Sql程式碼 
CREATE OR REPLACE PROCEDURE proc_X() 
IS 
  v_ID INT; 
  v_ANAME VARCHAR2(20);       
   --定義遊標: 
   v_account_cur SYS_REFCURSOR; 
BEGIN 
     --呼叫儲存過程: 
       Report_Month_Responsibility(v_account_cur);        
       fetch v_account_cur into v_ID,v_ANAME; 
      --用迴圈顯示遊標中的記錄: 
       while v_account_cur%found loop 
             dbms_output.put_line('The value of column ID is: '||v_ID);--打引列ID 
             dbms_output.put_line('The value of column ANAME is: '||v_ANAME);   
             --打引列ANAME           
             fetch v_account_cur into v_ID,v_ANAME; 
       end loop; 
       close v_account_cur;     
       execute immediate 'truncate TABLE REPROTTEST';    
end proc_X; 

相關推薦

oracle儲存過程,臨時,遊標示例

總結如下: DDL是一種消耗資源非常大的操作,執行時儘量不要使用DDL語句,應用程式需要的臨時表應在執行之前就開始建立。不必在每個儲存過程中建立一次。臨時表總是存在的,他們作為物件存在於資料字典中,並且總是保持為空,直到有會話在其中放入資料 1 建立臨時表 Sql程式碼 

oracle學習筆記(二)分享儲存過程巢狀遊標例子

create or replace procedure aa1 is v_aa varchar2(20); v_bb varchar2(20); va_aa varchar2(20); va_bb varchar2(20); va_number_aa number; mess

Oracle儲存過程和MERGE INTO語句

一、MERGE INTO語句   1、merge into語句的功能:我們操作資料庫的時候,有時候會遇到insert或者Update這種需求。我們操縱程式碼時至少需要寫一個插入語句和更新語句並且還得單獨寫方法效驗資料是否存在,這種操作完全可以用merge into語句代替,不僅省時省力而且條理更清晰,一個S

oracle儲存過程4-儲存過程變數的使用

1.儲存過程基本結構。從is到begin區域為宣告變數區域,從bengin到end區域為邏輯程式碼區域。 建立變數並賦值。建立變數時需要指定取值範圍。 變數名 := 值; x number(4,2); x := 1;   使用 帶引數的儲存過程。儲存過程

MySql 儲存過程 臨時 無法插入資料

今天在寫儲存過程的時候,發現一個問題就是,sql明明能查出資料,為啥無法插入到臨時表、實體表呢? 儲存過程擷取如下: BEGIN /*****************************

oracle編譯儲存過程提示或檢視不存在的問題分析

       今天有同事跟我反映有個儲存過程編譯報錯,提示表或檢視不存在。儲存過程中呼叫的那個表t是另一個使用者b的表。但是當前使用者a已經擁有dba角色了,為什麼訪問不到使用者b的表t呢?另一同事說

oracle儲存過程2-建立儲存過程

第一步:連線資料庫後,在“object”視窗中找到“procedures”目錄,在該目錄上點選右鍵,選擇“new”選單建立儲存過程。       建立後的介面,該儲存過程是沒有引數的。    第二步:編寫一條程式碼,編譯儲存過程。  建立和編譯儲存過程到這裡就已經完成

Oracle 編譯儲存過程報錯: 或檢視不存在問題分析與解決

今天遇到一個問題,自己寫了一個很簡單的儲存過程,編譯的時候,報錯: 表或檢視不存在;      但是:表確實是存在,單獨拿出來查詢,一點問題也沒有。      經過幾番查詢,找到了問題所在: 查詢表的許可權不夠; 解決方案:

oracle儲存過程裡面呼叫其它的儲存過程(包含遊標

第一種情況是返回的遊標是某個具體的表或檢視的資料,如 CREATE OR REPLACE PROCEDURE P_TESTA ( PRESULT OUT SYS_REFCURSOR ) AS BEGIN OPEN PRESULT FOR SELECT * FROM USER

Sql Server在儲存過程裡面使用遊標遍歷一個

這裡關於SqlServer有兩個知識點:一個是使用遊標遍歷表,另一個是使用if not exists的sql語句進行插入。 一、使用遊標遍歷表   這個表可以是資料庫的表,也可以是外面DataTable型別的引數傳進去,使用遊標可以概括為以下步驟:宣告遊標、開啟遊標、讀取

oracle儲存過程中寫兩個遊標巢狀迴圈

CREATE OR REPLACE PROCEDURE "PROC_CHZBANKMOTNREC" AS vid NUMBER(19);--id vzdrpriaccount VARCHAR2(1

Oracle 儲存過程 遍歷 遊標 資料集 效率比較

  Oracle中游標使用效率比較 2013年09月26日 21:09:08 進擊的胖蛇 閱讀數:4380 鳴謝:http://blog.163.com/[email protected]/blog/static/34469732201272534

Oracle】PL/SQL 儲存過程 顯式遊標、隱式遊標、動態遊標

  【Oracle】PL/SQL 顯式遊標、隱式遊標、動態遊標 2013年06月17日 09:02:51 AlphaWang 閱讀數:13009更多 個人分類: 【Database】 在PL/SQL塊中執行SELECT、INSERT、DELET

oracle執行儲存過程返回遊標cursor

create or replace procedure TEST(s varchar2, r_result out sys_refcursor) is   --作者:lml   --功能:根據tokenid查詢放行指令   --詳情:   --1.返回放行指令   --時間

sql中的讀取(所有的儲存過程名、某的所有列名’、臨時

---讀取資料庫中的所有儲存過程名稱 use [資料庫名]select name from sys.procedures --讀取庫中的所有表名select name from sysobjects where xtype='u' --讀取指定表的所有列名select na

sqlserver儲存過程中利用遊標遍歷結果集簡單示例及查詢資料庫時間

本例項用的是sqlserver2005   在儲存過程中遍歷結果,和查詢資料庫中所有 儲存過程名稱 加以處理以文字形式輸出 原始碼: drop procedure findName create procedure findName--建立一個名為findName的儲存過

oracle儲存過程寫法以及呼叫,各種遊標的介紹(靜態,動態,sys遊標的區別)

1、plsql下執行不帶引數的儲存過程      CALL  getDeptCount(); 2、plsql下執行帶引數的儲存過程DECLARE,必須使用程式碼段,並且可以列印其中的輸出引數 salary varchar2(100); BEGIN getSalaryByE

Oracle儲存過程使用動態遊標

spool F:/dbtest12.log; set timing on; set serveroutput on; declare --定義遊標:獲取所有表 CURSOR c_allTables IS select t.OWNER,t.TABLE_NAME from

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

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

oracle儲存過程建立

create or replace procedure createtable(tname in varchar2) is SQLTEXT varchar2(400); v_createsql varchar2(400); v_dropsql var