/*
達內學習 Oracle day44 2013-11-4
*/
回憶:
a,使用varchar 來處理變長字符串,在sql中正常使用,在宿主語言中用.arr取出
防止亂碼, 初始化, .arr[.len]='\0'
b,proc預編譯選項
iname cname char_map = string
宿主變量的注意事項:
1,要求宿主變量放入申明區
exec sql begin declare section;
exec sql end declare section;
2,可以使用指針 不推薦
3,ddl中不能使用宿主變量
4,在sql語句中使用宿主變量時候 前面要加冒號
4 ,指示變量
當數據庫中的字段值, 賦值給宿主變量時候,賦值的狀態可以通過指示變量得到
==0 賦值正常
== -1 數據庫中字段值是null
>0 階段賦值 儘量避免
short 類型
: 宿主變量:指示變量
: 宿主變量 indicator: 指示變量
5 ,數組變量
proc只支持一維數組 字符除外
不能使用數組指針
最大元素個數 32767
在 select 語句中,只能出現數組名 不能出現下標
6,sqlca通信區
一個事務中的sql語句 每執行一句都會把一個叫sqlca的結構體,的所有字段更新一遍
sqlca.sqlerrd[2] sqlca中影響的行數
sqlca.sqlcode sql語句執行的狀態
== 0 正常
>0 異常發生
<0 系統錯誤(網絡錯誤)
sqlca.sqlerrm.sqlerrmc sql出錯信息
7,oraca 通信區
對sqlca 的信息補充,消耗資源比較大,默認關閉狀態
從oraca中取得執行的sql語句
1,包含oraca
exec sql include oraca;
2,打開oraca
exec oracle option(oraca=yes);
3, 設置sql的保存標誌
oraca.orastxtf=0 默認狀態 不保存sql
=1 出現錯誤時保存
=2 出現警告或者錯誤保存
=3 所有都保存
4,得到sql語句
oraca.orastxt.orastxtc
proc 中select的佔位符和 plsql中是一樣的
8, proc 中最重要最簡單的內容
proc 中如何嵌入sql語句
a,select語句
在select語句前 在 exec sql
select 語句要和into:宿主變量結合
exec sql select first_name into :var_name where id = :id;
b,dml intsert delete update
tcl comimit rollback savepoint
ddl create drop alter
只需在前面家exec sql
ddl中不能出現宿主變量
9, proc中如何調用plsql
a,proc中如何調用存儲過程
設計一個存儲過程 傳入兩個整數參數 ,把兩個參數的和存入第二個參數中
create or replace procedure getsum(x int number ,y in out number)
is
begin
y:= x+y;
end;
exec sql execute
begin
/* 相當於匿名快 */
end;
end-exec;
預編譯時需要兩個預編譯選項
selcheck=semantics
userid=用戶名/密碼 在預編譯時鏈接 數據庫確定存儲過程中是否存在並檢查存儲過程的合法性
proc sqlcheck=semantics callprocedure.pc userid = openlab/open123
b,proc 中如何調用函數
寫一個函數 傳入兩個整數參數,返回兩個參數最大值,並把兩個參數的和放入第二個參數中,兩個參數必須使用proc的宿主參數 驗證函數的功能
10. 遠程數據庫鏈接
本地數據庫鏈接
exec sql connect:userpasswd;
EXEC SQL CONNECT :userName IDENTIFIED BY :userPwd;
默認鏈接的是
echo $ORACLE_SID 得到數據庫服務名
遠程數據庫鏈接
char userPwd[20] = “scott / tiger”;
char dbString[20] = “remoteDB”;
EXEC SQL CONNECT : userPwd Using :dbString;
remoteDB 是網絡服務名, 在
$ORACLE_HOME/network/admin/tnsnames.ora文件中定義.
exec sql connect: userpasswd;
爲了遠程鏈接
char rdbdes[30]="CAH_192.168.0.26";
/* 直接和遠程數據庫 建立鏈接 */
exec sql connect:userpasswd using:redbdes;
exec sql connect:userpasswd;
/* 後面的操作無法區分在數據庫鏈接上的操作 */
at 關鍵字後面可以跟一個標籤
char db23[20]="db23";
exec sql connect:userpasswd at :db23
exec sql connect:userpassed at:db26 using:redbdes;
using 後面跟數據庫描述
at 後的數據是用於區分數據庫鏈接的
insufficient privileges 權限不足
create darabase link my26link onnect to openlab identifide by open123
{}
update s_emp@my26link set salary = 1200 where id=1;
遠程數據庫的事務 交給本地數據庫控制
11,proc中的異常處理
sqlca.sqlcode 得到sql語句的執行狀態
exec sql whenever 條件 動作
條件:sqlerror notfound sqlwarnng
動作:do 錯誤處理函數
do break;
continue;
stop;
goto 標籤;
12.數據的操作
a,使用單個變量 一次操作單行數據
exec sql select first_name into :var_name from s_emp where id=1;
b,使用多個變量一次操作單行多列
exec sql select first_name,salary into :var_name,:varsal from s_emp where id =1;
c,使用結構體操作單行多列
C++ 中要求把結構體的定義放入申明區
d,數組變量可以操作多行多列
f,遊標操作多行多列
proc中的遊標使用步驟
1,聲明遊標
exec sql declare 遊標名 cursor for sql語句;
2,打開遊標
exec sql open 遊標名;
3,提取數據 處理數據
exec sql fetch 遊標名 into: 結構變量;
4,關閉遊標
exec sql close 遊標名;
如何 遍歷遊標中所有的數據:
exec sql whenever notfound do break;
滾動遊標:可以不按照順序訪問
scroll cursor
last first
prior 前一個
next 下一個
current 當前
relative n相對當前 正向後 負數向前
absolute n絕對
13,動態sql
1,把一條字符串 對應的sql 當作真正的sql來執行
動態sql
不能有select 語句
不能有:佔位符
exec sql execute immediate :sqlstr;
2,可以有展位符,不能有select
exec sql prepare s from :sqlstr;
exec sql execute using :宿主變量
3,只能是select 可以有佔位符 動態sql2 和 遊標的結合
“select id,first_name,salary from s_emps”
動態sql2 和遊標的結合
char sqlstr[100]="seleect id,first_name,salaryfrom s_emp where id>b 0";
int id =15;
exec sql prepare s from :sqlstr;
exec sql declare empcursor cursor for s;
exec sql open empcursor using:id;
------------------------------------------------
列出相關null相關的知識
1,nvl(par1,par2)
不爲空返回第一個,爲空返回第二個,類型要求一致
2,where 字段 is null
3,排序
4,錶鏈接 內鏈接 外鏈接 等值 非等值 自連接 (+)
5,組函數和分組
6,子查詢
7,DDL
8,約束
9,三範式
10,其他對象
序列 索引 視圖 分頁