1. 程式人生 > >Oracle表值函式的兩種寫法

Oracle表值函式的兩種寫法

-- 建立表
DECLARE
  CNT INTEGER;
BEGIN
  SELECT COUNT(0)
    INTO CNT
    FROM USER_ALL_TABLES
   WHERE TABLE_NAME = 'CMSTEMP';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE '  CREATE TABLE CMSTEMP(
  ID INTEGER PRIMARY KEY,
  NAME VARCHAR2(32),
  AGE INTEGER,
  ADDRESS VARCHAR2(64)
  )';
  END IF;
END;
-- 建立 type
DECLARE
  CNT INTEGER;
BEGIN
  SELECT COUNT(0) INTO CNT FROM USER_TYPES WHERE TYPE_NAME = 'CMSTEMPTYPE';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE 'CREATE OR REPLACE TYPE CMSTEMPTYPE AS OBJECT ( 
 ID INTEGER,
  NAME VARCHAR2(32),
  AGE INTEGER,
  ADDRESS VARCHAR2(64)
)';
  END IF;
END;
-- 建立type 表
DECLARE
CNT INTEGER;
BEGIN
  SELECT COUNT(0) INTO CNT FROM USER_TYPES WHERE TYPE_NAME = 'CMSTEMPTYPETABLE';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE '
CREATE OR REPLACE TYPE CMSTEMPTYPETABLE AS TABLE OF CMSTEMPTYPE ' ; 
    END IF;
  END;
-- 建立臨時表
DECLARE
  CNT INTEGER;
BEGIN
  SELECT COUNT(0)
    INTO CNT
    FROM USER_ALL_TABLES
   WHERE TABLE_NAME = 'CMSTEMPGLO';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE CMSTEMPGLO(
  ID INTEGER PRIMARY KEY,
  NAME VARCHAR2(32),
  AGE INTEGER,
  ADDRESS VARCHAR2(64)
  )
  ON COMMIT PRESERVE ROWS';
  END IF;
END;
--建立包
CREATE OR REPLACE PACKAGE GLOBALPACKGE
AS
TYPE CUR1 IS REF CURSOR;
END;
第一種方式使用臨時表
CREATE OR REPLACE FUNCTION NS_CMS_GETCMSTEM(NAME VARCHAR2)
  RETURN CMSTEMPTYPETABLE
  PIPELINED IS
  PRAGMA AUTONOMOUS_TRANSACTION;
  V_NAME    VARCHAR2(32);
  V_AGE     INTEGER;
  V_ADDRESS VARCHAR2(64);
  V_ID      INTEGER;
  RWS       CMSTEMPTYPE := CMSTEMPTYPE(NULL, NULL, NULL, NULL);
  V_CUR     GLOBALPACKGE.CUR1;
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE CMSTEMPGLO';
  FOR REC IN (SELECT * FROM CMSTEMP) LOOP
    V_NAME    := REC.NAME;
    V_AGE     := REC.AGE;
    V_ID      := REC.ID;
    V_ADDRESS := REC.ADDRESS;
    INSERT INTO CMSTEMPGLO
      (ID, ADDRESS, AGE, NAME)
    VALUES
      (V_ID, V_ADDRESS, V_AGE, V_NAME);
      DBMS_OUTPUT.PUT_LINE('11111111111');
  END LOOP;
  COMMIT;
  OPEN V_CUR FOR
    SELECT * FROM CMSTEMPGLO;
  LOOP
    FETCH V_CUR
      INTO RWS.ID,RWS.NAME,RWS.AGE,RWS.ADDRESS;
    EXIT WHEN V_CUR%NOTFOUND;
    PIPE ROW(RWS);
  END LOOP;
  CLOSE V_CUR;
END;

第二種方式不適用臨時表
CREATE OR REPLACE FUNCTION NS_CMS_GETCMSTEMP(NAME VARCHAR2)
  RETURN CMSTEMPTYPETABLE
  PIPELINED AS
  PRAGMA AUTONOMOUS_TRANSACTION;
  V_CUR     GLOBALPACKGE.CUR1;
  V_NAME    VARCHAR2(32);
  V_ADDRESS VARCHAR2(64);
  V_AGE     INTEGER;
  V_ID      INTEGER;
  RET_ROW   CMSTEMPTYPE := CMSTEMPTYPE(NULL, NULL, NULL, NULL);
  RET_TABLE CMSTEMPTYPETABLE := CMSTEMPTYPETABLE();  -- 這裡必須這樣寫
BEGIN
  FOR REC IN (SELECT * FROM CMSTEMP) LOOP
    RET_TABLE.EXTEND;
    RET_ROW.ID      := REC.ID;
    RET_ROW.AGE     := REC.AGE;
    RET_ROW.NAME    := REC.NAME;
    RET_ROW.ADDRESS := REC.ADDRESS;
    RET_TABLE(RET_TABLE.COUNT) := RET_ROW;
  END LOOP;
  COMMIT;
  open V_CUR for
  select * from table(RET_TABLE);
  loop
    fetch V_CUR into RET_ROW.ID,RET_ROW.NAME,RET_ROW.AGE,RET_ROW.ADDRESS; --順序要和type物件裡定義的順序保持一致
    exit when V_CUR%notfound;
    pipe row(RET_ROW);
    end loop;
    close v_cur;
END;
插入資料
<pre class="sql" name="code">declare
i integer;
begin
  for i in 1 ..100 loop
    insert into cmstemp values (i,'zhangsan'||i,1+i,'王府大街'||i);
    commit;
    end loop;
  end;

查詢sql
<pre class="sql" name="code">select * from table(ns_cms_getcmstemp('')) ; 
select * from table(NS_CMS_GETCMSTEM('')) ; 



相關推薦

Oracle函式寫法

-- 建立表 DECLARE CNT INTEGER; BEGIN SELECT COUNT(0) INTO CNT FROM USER_ALL_TABLES WHERE

JavaWeb後臺從input單獲取文本方式

out script body throws ioe spa ava set action JavaWeb後臺從input表單獲取文本值的兩種方式 #### index.html <!DOCTYPE html> <html

Oracle修改序列當前方式

總是忘記對序列的操作,特將此記錄下來。 1、直接drop sequence seq_t_test;然後重新建立並且設定序列的初始值為希望的資料 SQL: drop sequence seq_t_test; create sequence seq_t_test; increment by 1

【v-on】一個元素繫結多個事件以及一個事件繫結多個函式寫法

本文程式碼主要講述了v-on繫結事件函式傳參,一個元素繫結多個事件的兩種寫法,一個事件繫結多個函式的兩種寫法,修飾符的使用。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8

vue繫結與字串拼接寫法

<cell :title="`當前門店:${item.Storename}`" link="/component/radio" :inline-desc="'門店地址:' + item.Storeaddess"></cell> 第一種 :title="`字串${xx}

關於forEach函式寫法

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>forEach demo</title> </head>

javascript中自執行(自呼叫)函式寫法

自執行函式定義: 自執行函式或是自呼叫函式 宣告完了,馬上進行呼叫,只能使用一次,,有兩種寫法,舉個栗子如下: 寫法一: 格式:(函式)(實參) <script&g

為結構體中函式指標賦方法

/** 02. * 為結構體中的指標陣列賦值 03. */ 04. 05.#include <stdio.h> 06. 07.typedef struct test 08.{ 09. void (*p)(void); 10.

前端from單中action屬性值得寫法

1. 直接寫後端定義好的路徑urlurlpatterns = [ url(r'^register/$',register), ]<form action='/register/' method='post'></form>   缺點:當後端給定

oracle刪除資料的的方式

平時寫sql中我們都會用到刪除語句,而平時刪除表資料的時候我們經常會用到兩種方式: 在oracle中,truncate、delete都可以刪除表資料,具體的區別以及sql語法如下: truncate table [表名]; delete from [表名]; de

【shell】獲取函式返回方法

方法一: 使用全域性變數 g_result="" function testFunc() { g_result='local value' } testFunc echo $g_resu

【OC學習-8】存取器方法?getter和setter?事實上就是賦和返回函數

trac -m main 都是 protect pro 聲明 return 安全 我們在聲明類的時候,有實例變量+方法(函數),這些實例變量假設默認的話都是protected類型,一般無法直接訪問。更別提賦值和調用了,所以就產生了兩種函數,ge

HDU 2102 A計劃 DFS與BFS寫法

blog ons bsp 求解 stream eof node 耗時 {} 1.題意:一位公主被困在迷宮裏,一位勇士前去營救,迷宮為兩層,規模為N*M,迷宮入口為(0,0,0),公主的位置用‘P‘標記;迷宮內,‘.‘表示空地,‘*‘表示墻,特殊的,‘#‘表示時空傳輸機,走到

前臺向後臺傳方法 以及 從後臺獲取數據的方法

list 獲取數據 data border asc req rip attr 訂單 1、前臺向後臺傳值方法一: 表單提交的方式: 1 <form action="${path }/manage/logon.do" method="post" id="logonFo

js對象取方式

使用 obj 括號 code spa bsp key值 兩種 var var obj = {abc:"ss",nn:90}; var v1 = obj.abc;//使用點的方式 var v2 = obj["abc"];//使用中括號的方式 在實際項目中一般使用點,會方便

不用第三方參數,交換2個參數的宏函數

三方 logs cto ring using def names 第三方 fine #include <iostream> #include <stdio.h> #include <string.h> #include <vect

es6對象內函數的寫法

images style image class cti window對象 ima nbsp 方法 es6對象內函數一般有兩種寫法: var person1 = { name: "p1", sayThis() { console.log(t

CSS中`nav ul li ul` 與 `nav>ul>li` 這寫法的區別是什麽

class apach pac 順序 code nbsp ron 例如 選擇 >是指只能一代接一代,比如: nav>ul>li>ul>li,必須是下面這樣的 <nav> <

LCA的寫法

blank mes col tarjan include pri for namespace continue 第一種是離線的Tarjan算法 #include<cstdio> using namespace std; int rd(){ int x=

【轉載】form單的提交方式,submit和button的用法

按鈕 type ssid login false tex .get ons 轉載 1.當輸入用戶名和密碼為空的時候,需要判斷。這時候就用到了校驗用戶名和密碼,這個需要在jsp的前端頁面寫;有兩種方法,一種是用submit提交。一種是用button提交。方法一:在jsp的前端