46,數據庫(08)

/*
達內學習 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,其他對象
     序列 索引 視圖  分頁


 

 

發佈了72 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章