1. 程式人生 > >ORACLE:SELECT語句裡呼叫函式使用DML語句進行UPDATE/INSERT/DELETE操作

ORACLE:SELECT語句裡呼叫函式使用DML語句進行UPDATE/INSERT/DELETE操作

需求:

公司一系統升級,要維護的資料庫表中已有資料,該表沒有序列、觸發器等。此表要直接插入一些資料,插入的資料為了和以前的資料相容(就是一樣)。該表主鍵的生成以前是在程式碼中分兩步進行的,即查詢、更新(現在要直接插入資料,不用服務端JAVA程式碼,不能用這個)。

做法:

本人很懶,希望一條SQL完成上面的插入並更新。而本人oracle資料庫(應該說所有資料庫)很菜,不會啊,於是找度娘,發現如下兩篇資料對我有用(PS:找得好辛苦!):

1、http://www.byywee.com/page/M0/S262/262303.html
2、http://www.cnblogs.com/wuyisky/archive/2010/05/11/oracle_function.html
其中第2篇資料有如下內容:
函式呼叫限制
1、SQL語句中只能呼叫儲存函式(伺服器端),而不能呼叫客戶端的函式
2、SQL只能呼叫帶有輸入引數,不能帶有輸出,輸入輸出函式
3、SQL不能使用PL/SQL的特有資料型別(boolean,table,record等)
4、SQL語句中呼叫的函式不能包含INSERT,UPDATE和DELETE語句

附1我的函式:

CREATE OR REPLACE FUNCTION GETPREPAYID
   RETURN INTEGER
IS
   PRAGMA AUTONOMOUS_TRANSACTION;
   PREPAY_ID   INTEGER;
BEGIN
       SELECT s.max_value
         INTO PREPAY_ID
         FROM sys_bill_maxvalue s
        WHERE s.account_type = 'const' AND s.bill_type = '預繳費記錄'
   FOR UPDATE OF s.max_value;

   UPDATE sys_bill_maxvalue sb
      SET sb.max_value = PREPAY_ID + 1
    WHERE sb.account_type = 'const' AND sb.bill_type = '預繳費記錄';

   COMMIT;

   RETURN (PREPAY_ID);
END GETPREPAYID;

附2我的SQL:

INSERT INTO vehicle_prepay_record vpr (vpr.PREPAY_ID,
                                       vpr.VEHICLE_ID,
                                       vpr.PREPAY_DATE,
                                       vpr.PAY_MONEY,
                                       vpr.DISINFECTIONBAL,
                                       vpr.STATUS_FLAG,
                                       vpr.CREATOR,
                                       vpr.CREATE_DATE,
                                       vpr.DATASTATUS,
                                       vpr.VEHICLE_REMAIN_MONEY,
                                       vpr.DISINFECTIONBAL_REAIN)
   SELECT GETPREPAYID,
          V.VEHICLE_ID,
          SYSDATE,
          -v.DISINFECTIONBAL_REMAIN,
          v.DISINFECTIONBAL_REMAIN,
          'YA',
          '管理員',
          SYSDATE,
          '1',
          V.PAY_MONEY_REMAIN,
          V.DISINFECTIONBAL_REMAIN
     FROM DUAL, vehicle v;
目前我有疑問:
按函式呼叫限制第4條,我的SQL語句有DML語句為何還成功了?
是不是函式呼叫限制說的有問題?

相關推薦

ORACLE:SELECT語句呼叫函式使用DML語句進行UPDATE/INSERT/DELETE操作

需求: 公司一系統升級,要維護的資料庫表中已有資料,該表沒有序列、觸發器等。此表要直接插入一些資料,插入的資料為了和以前的資料相容(就是一樣)。該表主鍵的生成以前是在程式碼中分兩步進行的,即查詢、更新(現在要直接插入資料,不用服務端JAVA程式碼,不能用這個)。 做法: 本

oracle儲存過程處理ddl與dml語句

declare   CURSOR C_EVENT is  select table_name from [email protected]_YWKDB;      temp varchar2(100); begin       OPEN C_EVENT;    F

mybatis裡面xml中SQL語句if語句巢狀if語句

mybatis裡面的if語句需要加上(但是有時不需要 但是(又是在if語句中的 案例一  不完善 <select id="selectRechargeInfoChainCount" resultType="int">       select count(*)

Oracle資料庫 資料完整性和DML語句

 資料完整性和DML語句 資料完整性 資料完整性(Data Integrity)是指資料的精確性(Accuracy) 和可靠性(Reliability)。它是應防止資料庫中存在不符合語義規定的資料和防止因錯誤資訊的輸入輸出造成無效操作或錯誤資訊而提出的。資料完整性指儲存在資料庫中的所有資料值均正確的狀態。如果

Oracle select語句執行順序

最近在公司實習剛好需要用到oracle,作為之前沒有碰過oracle的我經常碰壁,而其中一個就是不是很瞭解其執行語句的順序,導致經常出現以下“靈異”的現象,比如用group by進行分組,結果出現多個相同的組,最後才發現是因為我在select裡使用了別名,而or

Oracle一些DML語句簡例

1.資料型別 varchar2, char, number,date,timestamp 2.建表 create table stuinfo( sid number primary key, sanme varchar2(20) not null, s

oracle DML語句

DML語句 1、  插入資料 建立一個新表 create table new_cust as select * from customers   --使用insert語句新增行 /* 確定要插入的行所在的表 確定要插入哪些列,沒有表示所有列 確定要插入的列的值列表 */

七、sql基礎:1.DML語句--【Oracle資料庫】

####七、DML語句 Data Manipulation Language,資料操縱語言,增刪改。 #####1. INSERT語句 ######1.1 格式一 insert into student (stu_id, stu_name) values(1

函式中的DML語句的執行問題--自治事務

問題:寫一個函式,函式中要更新資料庫中的某個欄位,函式在使用時格式是:select funcName() from dual; 那麼此函式中如果含有update語句 函式: create or replace function CalABGrpRearBounty() ret

[Oracle]高效的SQL語句之分析函式(一)--sum()

select deptno,       ename,       sal,  --按照部門薪水累加(order by改變了分析函式的作用,只工作在當前行和前一行,而不是所有行)sum(sal) over (partition by deptno orderby sal) CumDeptTot,       

select子句如何實現另一個select語句的查詢|在select子句用逗號隔開的每個項的本質是一個表示式

select case when lock_purpost in(SELECT id from data_dictionary) then (SELECT name from data_dictionary where id=lock_purpost)  else lock_purpost end as

SELECT INTO 和 INSERT INTO SELECT 兩種表復制語句

from 分享 目標表 lec table text 一個 ima 數據 from:http://www.cnblogs.com/freshman0216/archive/2008/08/15/1268316.html Insert是T-sql中常用語句,Inser

DDL與DML語句

插入數據 指定 def 1.2 技術分享 不能 事務提交 alter date 1. DDL語句 SQL語句:結構化查詢語句,使用SQL與數據庫“溝通”,完成相應的數據庫操作。 l DDL:數據定義語言,用來維護數據庫對象 1.1 創建表 ? CREATE:創建表 演示:創

Oracle種常用性能監控SQL語句

desc command out asi miss type ces allocated ransac --Oracle常用性能監控SQL語句 --1 SELECT * FROM SYS.V_$SQLAREA WHERE DISK_READS > 100; --2

DML語句

名稱 date 多表 字段 指定字段 where 字段名 insert upa DML 操作是指對數據庫中表記錄的操作,主要包括表記錄的插入(insert)、更新(update)、刪除(delete)和查詢(select)。 1.插入記錄 insert into 表名(na

Oracle數據庫,常用SQL語句匯總

sql oracl -s 使用率 style pac alter _id 查詢 --查看表空間名稱、數據文件的路徑、大小、及使用率select b.tablespace_name "表空間名稱", b.file_name "數據文件路徑",

Mysql DBA 高級運維學習筆記-DML語句insert知識講解

提示 delet gre 高級運維 gin eve .sql 測試表 平時 9.9.7.8 往表中插入數據 (1)命令語法 Insert into<表名>[(<字段名1>[…<字段名n>])]values(值1)[,(值n)] (2)新建

DML語句(四) -- 常見函數

use rand rdate bsp pla 字符串轉換 trunc 分類 hour 一、概述   功能:類似一 java 中的方法   好處:提高重用性和隱藏實現細節   調用:select 函數名(實參列表); 二、單行函數 1、字符函數   concat:連接  

DML語句(五) -- 分組查詢

from dml 分組函數 group by 列表 字段 查詢 ML 使用 一、語法 select 分組函數,分組後的字段 from 表名 【where 篩選條件】 order by 分組的字段 【having 分組後的篩選】 【order by 排序列表】 二、特點

DML語句(八) -- 分頁查詢

索引 off limit offset dml語句 IT rom 開始 page 一、應用場景 當要查詢的條目數太多,一頁顯示不全 二、語法   SELECT 查詢列表  FROM 表  LIMIT 【offset,】size 註意:   offset 代表的是起始的條