PB內建OEACLE資料庫介面的使用方法(轉)
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@]
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫鍵方面的內容資料庫
- PB中建立資料庫的方法資料庫
- idea內建資料庫DataGrip + 索引Idea資料庫索引
- ORACLE資料庫簡介(轉)Oracle資料庫
- pb9 資料視窗內按鈕用法
- Sybase資料庫簡介 (轉載)資料庫
- 我的PB程式資料庫升級程式資料庫
- idea內建資料庫 + sql語句庫表操作Idea資料庫SQL
- Sql Server資料庫如何去掉內容裡面的Html標籤SQLServer資料庫HTML
- kylix 資料庫應用簡介 (轉)資料庫
- SQL Server 內建轉換函式介紹SQLServer函式
- C++資料結構和pb資料結構的轉換C++資料結構
- 資料庫為何不建議部署在Docker容器內資料庫Docker
- Python中內建資料庫!SQLite使用指南! ⛵Python資料庫SQLite
- dede資料庫類使用方法 $dsql資料庫SQL
- Uber基於Apache Hudi構建PB級資料湖實踐Apache
- PB快取資料指南快取
- 兩資料庫在同一頁面的無縫輸出 (轉)資料庫
- 資料庫介紹--初識資料庫資料庫
- 全棧 – 11 資料庫 MySQL使用方法全棧資料庫MySql
- 全棧 - 11 資料庫 MySQL使用方法全棧資料庫MySql
- 資料庫介紹資料庫
- PB關於資料視窗內欄位值改變問題
- 內建資料結構-字串資料結構字串
- pb資料視窗型別型別
- domutils 工具庫的使用方法介紹
- PB讀取Excel檔案內容的方法(轉帖)Excel
- L10資料庫——資料庫介紹資料庫
- 把Access轉成SQL資料庫的方法介紹SQL資料庫
- 【PB】動態新增資料視窗列中下拉選單的內容
- Python SqlAlchemy資料庫持久化使用方法PythonSQL資料庫持久化
- Oracle資料庫-建庫、建表空間,建使用者Oracle資料庫
- MongoDB資料庫簡介MongoDB資料庫
- NewSQL資料庫簡介SQL資料庫
- IndexedDB資料庫介紹Index資料庫
- WIOD資料庫簡介資料庫
- Python內建資料型別Python資料型別
- 資料庫內功心法:資料庫基本理論資料庫