PB內建OEACLE資料庫介面的使用方法(轉)

heying1229發表於2007-07-17
PowerBuilder(PB)和Oracle分別是前端開發工具和RD
BMS的主流產品。PB提供了兩種與Oracle連線的介面:Pow
erSoft內建的資料庫介面(Native Database Interface)
和ODBC介面。本文介紹使用PB6?0內建Oracle介面的方法
,包括資料描述檔案的設定、儲存過程的呼叫和儲存過程
作為資料視窗資料來源的操作方法等內容,使用的RDBMS的Or
acle 7?3。

  PowerBuilder與Oracle的連線

  假定已安裝Oracle客戶端應用程式。可用Sqlplus或T
nsping等是否能連線到Oracle資料庫,確定在SQL?NET配
置檔案中使用的資料庫別名(Database Alias,又稱服務
器名,Server Name)。如有疑問,可在Oracle客戶端程式
目錄下tnsname.ora檔案中找到。另外保證搜尋路徑已包括
SQL?NET應用程式的安裝目錄(如C:ORAWIN95BIN)。

  進入PB的Database Profiles畫筆,可看到所有已安
裝的資料庫介面(PB6?0預設安裝的是Oracle 7?3版的接
口,如使用低版本的Oracle,需在安裝時指定),選擇“O7
3 Oracle 7?3”,點選“New”按鈕,進入Database Pro
file Setup對話方塊。在“Connection”頁輸入下列資訊:


  Profile Name:為該Database Profile起一個有意義
的名稱;

  Server:@TNS:ServerName,其中ServerName為上述數
據庫別名(伺服器名),如@TNS:ORA73;

  Login ID:Oracle資料庫中實際的使用者名稱,由於PB初
次連線到資料庫時要自動建立五個系統表(PowerBuilder
Catalog Table:PBCATTBL,PBCATCOL,PBCATEDT,PBCATFMT,
PBCATVLD,儲存表的擴充套件屬性),因此第一個連線到Oracle
的使用者必須具有建表、給PUBLIC角色授權等許可權。例如可
用SYSTEM使用者進行第一次連線,此後的連線對使用者則無特
殊要求;

  Password:該使用者的口令。

  設定上述內容後,即可連上Oracle。為最佳化資料庫連
接,還可設定下列選項:

  Prompt for Database Information:連線時是否提
示使用者輸入使用者名稱和口令;

  Generate Trace:啟動DB跟蹤工具,跟蹤連線;

  Thread Safe:開發需要多執行緒環境支援的分散式應
用時,選擇該項。預設為未選,適用於非分佈應用;

  PBDBMS:與儲存過程呼叫方式有關的引數。Oracle為
7?2或更高版本時,清除該選項,此時帶IN OUT引數的存
儲過程可作為資料視窗資料來源。7?2版本以下,選擇該項
,呼叫PBDBMS.Put-Line建立儲存過程的SQL語句,預設
是選中;

  Commit on Disconnect:斷開連線時,指定提交或回
退未提交的事務;

  Case Sensitive:連線的Oracle伺服器是否區分大小
寫。注意該項選中時,所有主鍵、包含主鍵的表名、外來鍵
須全為大寫字元。

  PowerBuilder Catalog Tables Owner:指定擁有PB
系統表的使用者,預設為“SYSTEM”。如果要使用多種顯示
格式或有效性規則,可以在不同的使用者下建立幾套系統表


  Table Criteria:指定滿足哪些條件的表、檢視和同
義詞可在“Select Tables”對話方塊中顯示出來。例如DEV
使用者下銷售子系統的表都以SALE開頭,則可以用SALE%、
DEV、“TABLE”、“VIEW”指定只顯示DEV使用者以SALE開
頭的表和檢視;

  Asynchronous:選擇該項,可在一個複雜的SQL語句
執行過程中,返回第一行結果前,切換到其他操作;

  Number of Seconds to Wait:若上一項選中,還可
進一步透過該項指定檢索資料時,等待資料庫響應的時間


  Retrieve Blocking Factor:決定資料視窗物件一次
可從資料庫取出的記錄數;

  Number of SQL Staments Cached:PB可將資料視窗
物件產生的SQL語句和嵌入式SQL語句儲存在SQL語句緩衝區
,該引數指定緩衝區為PB保留的SQL語句數目。該數值可
由下式計算:SQLCache=伺服器OPEN—CURSORS數-5(保留
的遊標數)-本連線預期使用的最大遊標數;

  Disable Bind:指定是否將輸入變數與SQL語句繫結
,此引數影響PB為資料視窗物件生成INSERT語句的方式;

  Static Bind:資料視窗物件檢索資料前是否檢測SEL
ECT語句的合法性;

  在Syntax頁,還可指定日期、時間的格式等。在Prev
iew頁可檢視Database Profile設定對應的PowerScript寫
法。

  Oracle儲存過程的使用

  歸納起來PB6?0中呼叫Oracle儲存過程有以下四種方
法。

  方法一:以關鍵字RPCFUNC宣告儲存過程;

  方法二:以DECLARE PROCEDURE語句宣告儲存過程;

  方法三:以動態SQL語句實現;

  方法四:呼叫函式PBDBMS.Put-Line。

  一般情況下,方法一能得到較好的執行效率和更完善
的功能。因此推薦使用方法一。但是某些型別的儲存過程
只能使用其他方法。以下重點介紹方法一和方法二。

  兩種方法比較起來,有以下幾點主要區別:

  1)方法一適用於具有IN、OUT和IN OUT引數的儲存過
程,而方法二僅支援IN和OUT引數,不支援IN OUT引數;

  2)方法一對引數的數目無限制,方法二最多支援255
個引數;

  3)方法一不支援記錄(Recorder)的傳遞,方法二可傳
遞和接收記錄。

  方法一操作步驟:

  1)在使用者物件畫筆中建立一個Class-Standard型別
的,從Transaction繼承的使用者物件。

  2)在此使用者物件中,宣告Local External Functions
,將儲存過程以RPCFUNC關鍵字宣告為外部函式。在Decla
re Local External Functions對話方塊中按Procedures按
鈕選擇要呼叫的後臺儲存過程,或直接輸入類似subroutin
e TEST(long id,ref string name)RPCFUNC ALIAS FOR
“DEV?TEST”的語句。例如中DEV?TEST的引數為(id IN
NUMBER,name IN OUT VARCHAR2)。

  3)儲存該使用者物件。

  4)在Application畫筆中,進入應用屬性對話方塊,在V
ariable Types頁,將上Transaction使用者物件設定為預設
的全域性變數SQLCA。

  5)指令碼中,編碼呼叫相應的外部函式。形式:SQLCA
?函式名(引數)。如可用“SQLCA?TEST(ln—id,ls—name
);”呼叫例子中定義的DEV?TEST儲存過程。其中ln—id,
ls—name為呼叫引數。

  方法一注意事項:

  1)由於PB中String型別的資料長度是動態分配的,因
此對Ref String型別的引數,每次呼叫前需要申請足夠的
空間。例如上例從輸入的id值檢索name,後臺宣告的NAME
資料型別為VARCHAR2(30),每次呼叫SQLCA?TEST前需要
用ls—name=SPACE(30)置ls—name為足夠長度的空串。

  2)類似地當傳遞的引數為陣列(後臺稱PL/SQL Table)
時,宣告引數為相應型別的動態陣列,並在每次呼叫前設
置陣列上界為足夠大的值。例如:DEV使用者的DEPT包中聲
明瞭TYPE tbl—name IS TABLE OF VARCHAR2(30) INDEX B
Y BINARY—INTEGER;儲存過程EMP—OF—DEPT(dept—id
IN NUMBER,name OUT DEPT.tbl—name)返回部門編寫為de
pt—id的部門的所有員工,置name陣列中。假定所有部門
的員工數目不超過100,則可用以下語句宣告和呼叫DEV?
EMP—OF—DEPT:

  Declare External Functions對話方塊中:

  Subroutine EMP—OF—DEPT(long dept—id,ref str
ing name[]) RPCFUNC ALIAS FOR ″DEV.EMP—OF—DEPT


  PowerScript指令碼中:

  long ln=dept—id

  string lsa—name[]

  ……

  lsa—name[100]=″ //置動態陣列lsa—name上界為
100

  ln—dept—id=2

  SQLCA.EMP—OF—DEPT(ln—dept—id,lsa—name) /
/檢索部門2的所有員工的名字

  方法二使用方法:

  在指令碼中加入如下編碼(以DEV?TEST為例):

  long ln—id

  string ls—name

  ln—id=100

  DECLARE test PROCEDURE FOR DEV.TEST(:ln—id);
//test有一個IN引數,一個OUT引數

  EXECUTE test;

  FETCH test INTO:ls—name;

  方法三使用方法:

  根據輸入輸出引數的不同,PB中的動態SQL語句有四
種格式:1)無輸入輸出引數;2)只有輸入引數,無輸出參
數;3)有確定數目輸入輸出引數;4)輸出結果列的數目不
定。其中第1)、第2)中格式的動態SQL語句也可用來呼叫簡
單的儲存過程。

  1)沒有輸入輸出引數的儲存過程。例如DEV?DEMO1存
儲過程沒有輸入輸出引數,可用下列語句呼叫:

  sqlstring=″EXECUTE DEMO1()″

  EXECUTE IMMEDIATE:sqlstring;

  2)只有輸入引數的儲存過程。例如DEV.DEMO2(name I
N VARCHAR2,birthday IN DATE)

  PREPARE SQLSA FROM ″EXECUTE DEMO2(?,?);″

  EXECUTE SQLSA USING:ls—name,:ldt—birthday;

  如果是7?2以下版本的Oracle,可用方法四PBDMBS.P
ut—Line()函式呼叫建立儲存過程。此時需選上Database
Profile中的PBDBMS核取方塊。

  儲存過程作為資料視窗的資料來源

  以一個簡單資料視窗(顯示伺服器的系統時間)為例說
明怎樣建立儲存過程作為資料來源的資料視窗。

  1)在某個包(如PACK—TYPE)中定義日期型別的Record
er自定義資料型別datarec;

  2)建立返回系統時間的儲存過程:

  PROCEDURE get—sysdata(sysdt IN OUT PACK-TYPE
.datarec)IS

  BEGIN

  open sysdt for select sysdate from dual;

  END;

  3)新建資料視窗,資料來源選擇Stored Procedure;

  4)在隨後的Select Stored Procedure對話方塊中選擇g
et—sysdate即可。

  如果作為資料來源的儲存過程有IN引數,則這些引數就
是資料視窗的檢索引數(Retrieve Argument)。
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10172717/viewspace-926900/,如需轉載,請註明出處,否則將追究法律責任。

相關文章