Oracle儲存過程乾貨(一):儲存過程基礎
/ SQLplus 中,設定 set serveroutput on 才能顯示輸出結果 /
--- 匿名的 PLSQL( 儲存過程 ) 塊,不儲存在資料庫中
begin null; end; /
begin dbms_output.put('hi '); /*put是不換行的輸出*/ dbms_output.put_line('hello world'); /*put_line是換行的輸出*/ end; /
--- 命名的儲存過程,儲存在資料庫中
create or replace procedure hello_procedure as begin null; end hello_procedure; /
--- 儲存過程裡面可以直接執行 DML
create table test (id number,name varchar(20)); begin insert into test values(1,'zmh'); commit; end; / begin insert into test values(2,'qyt'); commit; end; /
--- 儲存過程中不能直接執行 select ,如果要執行 select ,必須跟上 into 字句
begin select * from test; end; /
PLS-00428: 在此 SELECT 語句中缺少 INTO 子句
這個地方,我的理解是在儲存過程中執行 select 語句,需要先把資料賦值到事先宣告好的變數中,然後透過變數輸出出來,一個列需要對應一個變數。
declare v_name varchar2(20); begin select name into v_name from test where id=1; dbms_output.put_line(v_name); end; /
---select...into 只能賦值一行,不能賦值多行,如果賦值了不存在的行也會報錯 ( 但可以處理 )
意思就是儲存過程中, select 只能查一行 , 如下就會報錯 , 提示超出請求行數:
declare v_name varchar2(20); begin select name into v_name from test; dbms_output.put_line(v_name); end; /
ORA-01422: 實際返回的行數超出請求的行數
因此需要對 select 語句加 where 條件: where rownum<=1 或者 where id=1 。
下面是賦值了不存在的行的報錯,及解決辦法:
declare v_name varchar2(20); begin select name into v_name from test where id=3; dbms_output.put_line(v_name); end; /
ORA-01403: 未找到任何資料
解決的小技巧是,寫一個 union ,實際情況 union 空,將返回的值透過 max 函式篩選:
declare v_name varchar2(20); begin select max(name) into v_name from ( select name from test where id=3 union select null from dual); dbms_output.put_line(v_name); end; /
---select...into 多個列
雖然 select into 不能多個行,但是可以多個列:
declare v_id number; v_name varchar2(20); begin select id,name into v_id,v_name from test where id=1; dbms_output.put_line(v_id||','||v_name); end; /
--- 儲存過程裡面不能直接執行 DDL ,如果要執行 DDL ,可以使用動態 SQL(execute immediate)
begin alter table test add(tel varchar2(12)); end; /
PLS-00103: 出現符號 "ALTER" 在需要下列之一時 ....
解決辦法;
begin execute immediate 'alter table test add(tel varchar2(12))'; end; /
--- 動態 SQL 裡面不僅可以 DDL , DML 和 select...into 都可以
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70013625/viewspace-3008063/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle儲存過程Oracle儲存過程
- Oracle儲存過程乾貨(二):PLSQL控制語句Oracle儲存過程SQL
- Oracle儲存過程-1Oracle儲存過程
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程乾貨(三):PLSQL迴圈語句Oracle儲存過程SQL
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- Mysql儲存過程基礎(案例+程式碼)MySql儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- SQLSERVER儲存過程SQLServer儲存過程
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- MySQL---------儲存過程MySql儲存過程
- 造數儲存過程儲存過程
- linux呼叫儲存過程Linux儲存過程
- 儲存過程——遊標儲存過程
- Winform呼叫儲存過程ORM儲存過程
- 儲存過程 傳 datatable儲存過程
- mysql儲存過程整理MySql儲存過程
- JAVA儲存過程(轉)Java儲存過程
- JdbcTemplate調儲存過程JDBC儲存過程
- MySQL之儲存過程MySql儲存過程
- laravel建立一個儲存過程Laravel儲存過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- mybatis儲存過程返回listMyBatis儲存過程
- 資料庫儲存過程資料庫儲存過程
- mysql如何呼叫儲存過程MySql儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- SQL 分頁儲存過程SQL儲存過程