![]() ![]() |
|
用spt更新ORACLE | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/5/28 13:57:20 文章录入:杜斌 责任编辑:杜斌 | |
|
|
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 |
|
![]() ![]() |