打印本文 打印本文  关闭窗口 关闭窗口  
用spt更新ORACLE
作者:佚名  文章来源:不详  点击数  更新时间:2008/5/28 13:57:20  文章录入:杜斌  责任编辑:杜斌

Using Oracle SPs to Insert and Update Data from VFP 
Summary 
This demo code will connect to Oracle [using your ID and password] to create a table of Presidents, a trigger, a sequence and 
some stored procedures. The stored procedures can be called to insert and update data in the Presidents table. Three of the 
methods in the VFP class will pass data values to the Oracle procedures which will either be inserted into the table or 
update existing records in the table. The update SPs will also return a value equal to the number of records updated. 
Description 
The following demo code can be pasted into a Visual FoxPro PRG and run without modifications. 
*!* To use this code, you must be able to connect to Oracle and 
*!* have been granted the following Oracle privileges for the 
*!* UserID you connected with: 
*!* 
*!* DROP ANY SEQUENCE 
*!* DROP TABLE 
*!* CREATE TABLE 
*!* CREATE SEQUENCE 
*!* CREATE PROCEDURE 
*!* CREATE TRIGGER 
*!* 
*!* The UpdateMultiple and UpdateByKeyID methods show you how to 
*!* get a Stored Procedure to stuff a value inta a VFP variable 
*!* [i.e., passing a value by reference between an Oracle SP and VFP]. 
*!* 
*!* The Stored Procedures created in this demo do not have a COMMIT; line 
*!* after the INSERT or UPDATE SQL. When the connection is terminated, 
*!* Oracle will perform an implicit COMMIT. The Destroy method below 
*!* issues a SQLCOMMIT() if the lCommitOnDestroy property is TRUE. 
*!* 
CLEAR 
LOCAL oDemo 
oDemo = CREATEOBJECT(’OracleDemo’) 
IF TYPE(’oDemo’) <> "O" 

? ’No Connection. An Invalid UserID, Password and/or Server parameter was specified.’ 
RETURN 
ENDIF 
IF NOT oDemo.Cr8_Presidents() 
oDemo.Release() 

? ’Cr8_Presidents method failed.’ 
RETURN 
ENDIF 
IF NOT oDemo.Cr8_SProcs() 
oDemo.Release() 

? ’Cr8_SProcs method failed.’ 
RETURN 
ENDIF 
IF NOT oDemo.InsertData() 
oDemo.Release() 

? ’InsertData method failed.’ 
RETURN 
ENDIF 

? oDemo.UpdateMultiple() 

? [The Updated_By column was changed from "InsTest" to "Test1"] 
? [for Presidents with a LastName LIKE "Adams%"] 

? [-----------------------------------------------------------] 

? oDemo.UpdateByKeyID() 

? [For the record with KeyID = 40:] 
? [The FirstName column was changed from "George" to "GeorgE"] 
? [The LastName column was changed from "Bush" to "Bush1"] 
? [The Update_By column was changed from "InsTest" to "Test2"] 

oDemo.Release() 
RETURN 

DEFINE CLASS OracleDemo AS Custom 
nHandle = 0 
cUserID = [] 
lCommitOnDestroy = .T. 
PROTECTED PROCEDURE Init 
LOCAL lcConString, lnOldValue 
lnOldValue = SQLGETPROP(0, "DispLogin") 
SQLSETPROP(0, "DispLogin", 2) 
lcConString = [Driver=Microsoft ODBC for Oracle;UID=;PWD=;Server=;] 
THIS.nHandle = SQLSTRINGCONNECT(lcConString) 
SQLSETPROP(0, "DispLogin", lnOldValue) 
IF THIS.nHandle > 0 
THIS.GetUserID() 
ENDIF 
RETURN THIS.nHandle > 0 
ENDPROC 
PROCEDURE Release 
RELEASE THIS 
ENDPROC 
PROTECTED PROCEDURE Destroy 
IF THIS.nHandle > 0 
IF THIS.lCommitOnDestroy 
SQLCOMMIT(THIS.nHandle) 
ENDIF 
SQLDISCONNECT(THIS.nHandle) 
ENDIF 
ENDPROC 
PROTECTED PROCEDURE GetUserID 
SQLEXEC(THIS.nHandle, [select USER UserID from dual], [crsUser]) 
THIS.cUserID = ALLTRIM(crsUser.UserID) 
USE IN crsUser 
ENDPROC 
PROCEDURE UpdateMultiple 
LOCAL lcSQL, lnRetVal, laError(1) 
PRIVATE pcNameMask pcUpdated_By, pnRowCount 
pcNameMask = [Adams%] 
pcUpdated_By = [TEST1] 
pnRowCount = 0 
TEXT TO lcSQL TEXTMERGE NOSHOW PRETEXT 2 
begin <>.PrezUpdateAll 
(nRowCount=>?@pnRowCount, 
cNameMask=>?pcNameMask, 
cUpdated_By=>?pcUpdated_By); end; 
ENDTEXT 
lcSQL = STRTRAN(lcSQL, CHR(13) + CHR(10), [ ]) 
IF THIS.RunSQL(lcSQL) 
RETURN [UpdateMultiple RowCount: ] + TRANSFORM(pnRowCount) 
ELSE 
RETURN [] 
ENDIF 
ENDPROC 
PROCEDURE UpdateByKeyID 
LOCAL lcSQL, lnRetVal, laError(1) 
PRIVATE pnKeyID, pcLoginID, pcFirstName, pcLastName, pcUpdated_By, pnRowCount 
pnKeyID = 40 
pcLoginID = [GBUSH] 
pcFirstName = [GeorgE] 
pcLastName = [Bush1] 
pcUpdated_By = [Test2] 
pnRowCount = 0 
TEXT TO lcSQL TEXTMERGE NOSHOW PRETEXT 2 
begin <>.PrezUpdate 
(nRowCount=>?@pnRowCount, nKeyID=>?pnKeyID, cLoginID=>?pcLoginID, 
cFirstName=>?pcFirstName, cLastName=>?pcLastName, 
cUpdated_By=>?pcUpdated_By); end; 
ENDTEXT 
lcSQL = STRTRAN(lcSQL, CHR(13) + CHR(10), [ ]) 
IF THIS.RunSQL(lcSQL) 
RETURN [UpdateByKeyID RowCount: ] + TRANSFORM(pnRowCount) 
ELSE 
RETURN [] 
ENDIF 
ENDPROC 
PROCEDURE Cr8_Presidents 
LOCAL lcScript, lnRetVal 
TEXT TO lcScript TEXTMERGE NOSHOW PRETEXT 2 
drop sequence S_Presidents 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 

TEXT TO lcScript TEXTMERGE NOSHOW PRETEXT 2 
drop table Presidents 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 
TEXT TO lcScript TEXTMERGE NOSHOW PRETEXT 2 
create table Presidents 
(keyid number(4), 
loginid varchar2(8), 
lastname varchar2(30), 
firstname varchar2(30), 
updated_by varchar2(8)) 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 
TEXT TO lcScript TEXTMERGE NOSHOW PRETEXT 2 
create sequence S_Presidents start with 1 increment by 1 nocache 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 
TEXT TO lcScript TEXTMERGE NOSHOW PRETEXT 2 
create or replace trigger Presidents_BEFORE_INSUPDT 
before insert or update on <>.Presidents 
for each row 
declare 
v_Id Number; 
BEGIN 
If :new.KeyID Is Null or :new.KeyID < 1 Then 
select S_Presidents.nextval into v_Id from dual; 
:new.KeyID := v_Id; 
End If; 
END; 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 
ENDPROC 
PROCEDURE Cr8_SProcs 
LOCAL lcScript, lnRetVal 
TEXT TO lcScript NOSHOW PRETEXT 2 
CREATE OR REPLACE PROCEDURE PrezInsert 
(cLoginID IN Presidents.LoginID%Type, 
cLastName IN Presidents.LastName%Type, 
cFirstName IN Presidents.FirstName%Type, 
cUpdated_By IN Presidents.Updated_By%Type) AS 
BEGIN 
INSERT INTO Presidents 
(LoginID, LastName, FirstName, Updated_By) 
VALUES 
(cLoginID, cLastName, cFirstName, cUpdated_By); 
END; 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 
TEXT TO lcScript NOSHOW PRETEXT 2 
CREATE OR REPLACE PROCEDURE PrezUpdateAll 
(cNameMask IN Presidents.LastName%Type, 
cUpdated_By IN Presidents.Updated_By%Type, 
nRowCount OUT NUMBER) AS 
BEGIN 
UPDATE Presidents 
SET Updated_By = cUpdated_By 
WHERE LastName LIKE cNameMask; 
nRowCount := SQL%ROWCOUNT; 
END; 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 
TEXT TO lcScript NOSHOW PRETEXT 2 
CREATE OR REPLACE PROCEDURE PrezUpdate 
(nRowCount OUT NUMBER, 
nKeyID IN Presidents.KeyID%Type, 
cLoginID IN Presidents.LoginID%Type, 
cLastName IN Presidents.LastName%Type, 
cFirstName IN Presidents.FirstName%Type, 
cUpdated_By IN Presidents.Updated_By%Type) AS 
BEGIN 
UPDATE Presidents 
SET LoginID = cLoginID, 
LastName = cLastName, 
FirstName = cFirstName, 
Updated_By = cUpdated_By 
WHERE KeyID = nKeyID; 
nRowCount := SQL%ROWCOUNT; 
END; 
ENDTEXT 
IF NOT THIS.RunSQL(lcScript) 
RETURN .f. 
ENDIF 
ENDPROC 
PROCEDURE InsertData 
LOCAL laData(42, 3) 
laData[ 1, 1] = ’GWASHING’ 
laData[ 1, 2] = ’Washington’ 
laData[ 1, 3] = ’George’ 
laData[ 2, 1] = ’JADAMS’ 
laData[ 2, 2] = ’Adams’ 
laData[ 2, 3] = ’John’ 
laData[ 3, 1] = ’TJEFFERS’ 
laData[ 3, 2] = ’Jefferson’ 
laData[ 3, 3] = ’Thomas’ 
laData[ 4, 1] = ’JMADISON’ 
laData[ 4, 2] = ’Madison’ 
laData[ 4, 3] = ’James’ 
laData[ 5, 1] = ’JMONROE’ 
laData[ 5, 2] = ’Monroe’ 
laData[ 5, 3] = ’James’ 
laData[ 6, 1] = ’JQADAMS’ 
laData[ 6, 2] = ’Adams’ 
laData[ 6, 3] = ’John Q’ 
laData[ 7, 1] = ’AJACKSON’ 
laData[ 7, 2] = ’Jackson’ 
laData[ 7, 3] = ’Andrew’ 
laData[ 8, 1] = ’MVBUREN’ 
laData[ 8, 2] = ’Van Buren’ 
laData[ 8, 3] = ’Martin’ 
laData[ 9, 1] = ’WHARRISO’ 
laData[ 9, 2] = ’Harrison’ 
laData[ 9, 3] = ’William’ 
laData[10, 1] = ’JTYLER’ 
laData[10, 2] = ’Tyler’ 
laData[10, 3] = ’John’ 
laData[11, 1] = ’JPOLK’ 
laData[11, 2] = ’Polk’ 
laData[11, 3] = ’James’ 
laData[12, 1] = ’ZTAYLOR’ 
laData[12, 2] = ’Taylor’ 
laData[12, 3] = ’Zachary’ 
laData[13, 1] = ’MFILLMOR’ 
laData[13, 2] = ’Fillmore’ 
laData[13, 3] = ’Millard’ 
laData[14, 1] = ’FPIERCE’ 
laData[14, 2] = ’Pierce’ 
laData[14, 3] = ’Franklin’ 
laData[15, 1] = ’JBUCHANA’ 
laData[15, 2] = ’Buchanan’ 
laData[15, 3] = ’James’ 
laData[16, 1] = ’ALINCOLN’ 
laData[16, 2] = ’Lincoln’ 
laData[16, 3] = ’Abe’ 

laData[17, 1] = ’AJOHNSON’ 
laData[17, 2] = ’Johnson’ 
laData[17, 3] = ’Andrew’ 
laData[18, 1] = ’UGRANT’ 
laData[18, 2] = ’Grant’ 
laData[18, 3] = ’Ulysses’ 
laData[19, 1] = ’RHAYES’ 
laData[19, 2] = ’Hayes’ 
laData[19, 3] = ’Rutherford’ 
laData[20, 1] = ’JGARFIEL’ 
laData[20, 2] = ’Garfield’ 
laData[20, 3] = ’James’ 
laData[21, 1] = ’CARTHUR’ 
laData[21, 2] = ’Arthur’ 
laData[21, 3] = ’Chester’ 
laData[22, 1] = ’GCLEVELA’ 
laData[22, 2] = ’Cleveland’ 
laData[22, 3] = ’Grover’ 
laData[23, 1] = ’BHARRISO’ 
laData[23, 2] = ’Harrison’ 
laData[23, 3] = ’Benjamin’ 
laData[24, 1] = ’WMCKINLE’ 
laData[24, 2] = ’McKinley’ 
laData[24, 3] = ’William’ 
laData[25, 1] = ’TROOSEVE’ 
laData[25, 2] = ’Roosevelt’ 
laData[25, 3] = ’Theodore’ 
laData[26, 1] = ’WTAFT’ 
laData[26, 2] = ’Taft’ 
laData[26, 3] = ’William’ 
laData[27, 1] = ’WWILSON’ 
laData[27, 2] = ’Wilson’ 
laData[27, 3] = ’Woodrow’ 
laData[28, 1] = ’WHARDING’ 
laData[28, 2] = ’Harding’ 
laData[28, 3] = ’Warren’ 
laData[29, 1] = ’CCOOLIDG’ 
laData[29, 2] = ’Coolidge’ 
laData[29, 3] = ’Calvin’ 
laData[30, 1] = ’HHOOVER’ 
laData[30, 2] = ’Hoover’ 
laData[30, 3] = ’Herbert’ 
laData[31, 1] = ’FROOSEVE’ 
laData[31, 2] = ’Roosevelt’ 
laData[31, 3] = ’Franklin’ 
laData[32, 1] = ’HTRUMAN’ 
laData[32, 2] = ’Truman’ 
laData[32, 3] = ’Harry’ 
laData[33, 1] = ’DEISENHO’ 
laData[33, 2] = ’Eisenhower’ 
laData[33, 3] = ’Dwight’ 
laData[34, 1] = ’JKENNEDY’ 
laData[34, 2] = ’Kennedy’ 
laData[34, 3] = ’John’ 
laData[35, 1] = ’LJOHNSON’ 
laData[35, 2] = ’Johnson’ 
laData[35, 3] = ’Lyndon’ 
laData[36, 1] = ’RNIXON’ 
laData[36, 2] = ’Nixon’ 
laData[36, 3] = ’Richard’ 
laData[37, 1] = ’GFORD’ 
laData[37, 2] = ’Ford’ 
laData[37, 3] = ’Gerald’ 
laData[38, 1] = ’JCARTER’ 
laData[38, 2] = ’Carter’ 
laData[38, 3] = ’James’ 
laData[39, 1] = ’RREAGAN’ 
laData[39, 2] = ’Reagan’ 
laData[39, 3] = ’Ronald’ 
laData[40, 1] = ’GBUSH’ 
laData[40, 2] = ’Bush’ 
laData[40, 3] = ’George’ 
laData[41, 1] = ’WCLINTON’ 
laData[41, 2] = ’Clinton’ 
laData[41, 3] = ’William’ 
laData[42, 1] = ’GWBUSH’ 
laData[42, 2] = ’Bush’ 
laData[42, 3] = ’George W’ 
LOCAL lnI, lcSQL 
PRIVATE pcLoginID, pcLastName, pcFirstName, pcUpdated_By 
pcUpdated_By = "InsTest" 
FOR lnI = 1 TO 42 
pcLoginID = laData(lnI, 1) 
pcLastName = laData(lnI, 2) 
pcFirstName = laData(lnI, 3) 
lcSQL = "begin MARK.PrezInsert" ; 
+ "(cLoginID=>?pcLoginID," ; 
+ " cFirstName=>?pcFirstName," ; 
+ " cLastName=>?pcLastName," ; 
+ " cUpdated_By=>?pcUpdated_By); end;" 
THIS.RunSQL(lcSQL) 
ENDFOR 
ENDPROC 
PROTECTED PROCEDURE RunSQL 
LPARAMETERS pcSQL 
LOCAL lnRetVal 
lnRetVal = SQLEXEC(THIS.nHandle, pcSQL) 
IF lnRetVal < 0 
AERROR(laError) 

? pcSQL 

DISPLAY MEMORY LIKE laErr* 
ENDIF 
RETURN lnRetVal > 0 
ENDPROC 
ENDDEFINE
打印本文 打印本文  关闭窗口 关闭窗口