ABAP--原生SQL接口API(ADBC)的使用
2009-09-17 14:56
375 查看
sap为大家提供原生SQL(Native SQL)接口API,该接口主要由四个类组成:
CL_SQL_STATEMENT - Execution of SQL Statements
CL_SQL_PREPARED_STATEMENT - Prepared SQL Statements
CL_SQL_CONNECTION - Administration of Database Connections
CX_SQL_EXCEPTION - Exception Class
原生SQL接口API可以在ABAP里执行动态的原生SQL操作,解决用户一些非常特殊的操作需求。
样例一:数据定义语言DDL(Create,Drop,Grant,Revoke) 和数据操纵语言DML(Update,Insert,Delete)操作
REPORT demo_adbc_ddl_dml.
PARAMETERS p_name TYPE c LENGTH 10 DEFAULT 'mytab'.
SELECTION-SCREEN SKIP.
PARAMETERS: p_create RADIOBUTTON GROUP grp,
p_insert RADIOBUTTON GROUP grp,
p_select RADIOBUTTON GROUP grp,
p_drop RADIOBUTTON GROUP grp.
SELECTION-SCREEN SKIP.
PARAMETERS p_key TYPE i DEFAULT 1.
CLASS adbc DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
PRIVATE SECTION.
CLASS-DATA: dbname TYPE string,
sql TYPE REF TO cl_sql_statement,
wa1 TYPE c LENGTH 10,
wa2 TYPE c LENGTH 10,
err TYPE REF TO cx_sql_exception .
CLASS-METHODS: create RAISING cx_sql_exception,
insert RAISING cx_sql_exception,
select RAISING cx_sql_exception,
drop RAISING cx_sql_exception.
ENDCLASS.
CLASS adbc IMPLEMENTATION.
METHOD main.
dbname = 'ABAP_DOCU_DEMO_' && p_name.
TRY.
CREATE OBJECT sql.
IF p_create = 'X'.
create( ).
MESSAGE 'Create was successful' TYPE 'S'.
ELSEIF p_insert = 'X'.
insert( ).
MESSAGE 'Insert was successful' TYPE 'S'.
ELSEIF p_select = 'X'.
select( ).
MESSAGE 'Select was successful' TYPE 'S'.
ELSEIF p_drop = 'X'.
drop( ).
MESSAGE 'Drop was successful' TYPE 'S'.
ENDIF.
CATCH cx_sql_exception INTO err.
MESSAGE err TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
METHOD create.
sql->execute_ddl(
`CREATE TABLE ` && dbname &&
`( val1 char(10) NOT NULL,` &&
` val2 char(10) NOT NULL,` &&
` PRIMARY KEY (val1) )` ).
ENDMETHOD.
METHOD insert.
DO 100 TIMES.
wa1 = sy-index.
wa2 = sy-index ** 2.
sql->execute_update(
`INSERT INTO ` && dbname && ` ` &&
`VALUES ('` && wa1 && `','` && wa2 && `')` ).
ENDDO.
ENDMETHOD.
METHOD select.
DATA: result TYPE REF TO cl_sql_result_set,
msg TYPE c LENGTH 30,
key TYPE c LENGTH 10,
dref TYPE REF TO data,
rc TYPE i.
key = p_key.
result = sql->execute_query(
`SELECT val1, val2 ` &&
`FROM ` && dbname && ` ` &&
`WHERE val1 = ` && `'` && key && `'` ).
GET REFERENCE OF wa1 INTO dref.
result->set_param( dref ).
GET REFERENCE OF wa2 INTO dref.
result->set_param( dref ).
rc = result->next( ).
IF rc > 0.
WRITE: 'Result:' TO msg,
wa1 TO msg+10,
wa2 TO msg+20.
ELSE.
msg = 'No entry found'.
ENDIF.
result->close( ).
MESSAGE msg TYPE 'I'.
ENDMETHOD.
METHOD drop.
sql->execute_ddl(
`DROP TABLE ` && dbname ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
adbc=>main( ).
样例二、参数绑定样例
REPORT demo_adbc_ddl_dml_binding.
PARAMETERS p_name TYPE c LENGTH 10 DEFAULT 'mytab'.
SELECTION-SCREEN SKIP.
PARAMETERS: p_create RADIOBUTTON GROUP grp,
p_insert RADIOBUTTON GROUP grp,
p_select RADIOBUTTON GROUP grp,
p_drop RADIOBUTTON GROUP grp.
SELECTION-SCREEN SKIP.
PARAMETERS p_key TYPE i DEFAULT 1.
CLASS adbc DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
PRIVATE SECTION.
CLASS-DATA: dbname TYPE string,
sql TYPE REF TO cl_sql_statement,
wa1 TYPE c LENGTH 10,
wa2 TYPE c LENGTH 10,
err TYPE REF TO cx_sql_exception .
CLASS-METHODS: create RAISING cx_sql_exception,
insert RAISING cx_sql_exception,
select RAISING cx_sql_exception,
drop RAISING cx_sql_exception.
ENDCLASS.
CLASS adbc IMPLEMENTATION.
METHOD main.
dbname = 'ABAP_DOCU_DEMO_' && p_name.
TRY.
CREATE OBJECT sql.
IF p_create = 'X'.
create( ).
MESSAGE 'Create was successful' TYPE 'S'.
ELSEIF p_insert = 'X'.
insert( ).
MESSAGE 'Insert was successful' TYPE 'S'.
ELSEIF p_select = 'X'.
select( ).
MESSAGE 'Select was successful' TYPE 'S'.
ELSEIF p_drop = 'X'.
drop( ).
MESSAGE 'Drop was successful' TYPE 'S'.
ENDIF.
CATCH cx_sql_exception INTO err.
MESSAGE err TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
METHOD create.
sql->execute_ddl(
`CREATE TABLE ` && dbname &&
`( val1 char(10) NOT NULL,` &&
` val2 char(10) NOT NULL,` &&
` PRIMARY KEY (val1) )` ).
ENDMETHOD.
METHOD insert.
DATA dref TYPE REF TO data.
DO 100 TIMES.
GET REFERENCE OF wa1 INTO dref.
sql->set_param( dref ).
GET REFERENCE OF wa2 INTO dref.
sql->set_param( dref ).
wa1 = sy-index.
wa2 = sy-index ** 2.
sql->execute_update(
`INSERT INTO ` && dbname && ` VALUES (?,?)` ).
ENDDO.
ENDMETHOD.
METHOD select.
DATA: result TYPE REF TO cl_sql_result_set,
msg TYPE c LENGTH 30,
key TYPE c LENGTH 10,
dref TYPE REF TO data,
rc TYPE i.
key = p_key.
GET REFERENCE OF key INTO dref.
sql->set_param( dref ).
result = sql->execute_query(
`SELECT val1, val2 ` &&
`FROM ` && dbname && ` ` &&
`WHERE val1 = ?` ).
GET REFERENCE OF wa1 INTO dref.
result->set_param( dref ).
GET REFERENCE OF wa2 INTO dref.
result->set_param( dref ).
rc = result->next( ).
IF rc > 0.
WRITE: 'Result:' TO msg,
wa1 TO msg+10,
wa2 TO msg+20.
ELSE.
msg = 'No entry found'.
ENDIF.
result->close( ).
MESSAGE msg TYPE 'I'.
ENDMETHOD.
METHOD drop.
sql->execute_ddl(
`DROP TABLE ` && dbname ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
adbc=>main( ).
样例三、存储过程调用
REPORT demo_adbc_stored_procedure.
PARAMETERS incprice TYPE sflight-price.
CLASS demo DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
ENDCLASS.
CLASS demo IMPLEMENTATION.
METHOD main.
DATA: sql TYPE REF TO cl_sql_statement,
err TYPE REF TO cx_sql_exception,
dref TYPE REF TO data.
CREATE OBJECT sql.
TRY.
sql->execute_ddl(
`CREATE OR REPLACE PROCEDURE increase_price (x IN NUMBER) IS `
&& `BEGIN `
&& `UPDATE sflight SET price = price + x`
&& ` WHERE mandt = '` && sy-mandt && `'; `
&& `END;` ).
GET REFERENCE OF incprice INTO dref.
sql->set_param( data_ref = dref
inout = cl_sql_statement=>c_param_in ).
sql->execute_procedure( proc_name = 'increase_price' ).
CATCH cx_sql_exception INTO err.
MESSAGE err TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
INITIALIZATION.
IF sy-dbsys <> 'ORACLE'.
MESSAGE 'Example is only for Oracle SQL' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
START-OF-SELECTION.
demo=>main( ).
样例四、动态查询样例,参见sap程序ADBC_QUERY
以上代码都是从sap帮助文档摘抄。
相关连接:http://help.sap.com/abapdocu_70/en/ABENADBC.htm
CL_SQL_STATEMENT - Execution of SQL Statements
CL_SQL_PREPARED_STATEMENT - Prepared SQL Statements
CL_SQL_CONNECTION - Administration of Database Connections
CX_SQL_EXCEPTION - Exception Class
原生SQL接口API可以在ABAP里执行动态的原生SQL操作,解决用户一些非常特殊的操作需求。
样例一:数据定义语言DDL(Create,Drop,Grant,Revoke) 和数据操纵语言DML(Update,Insert,Delete)操作
REPORT demo_adbc_ddl_dml.
PARAMETERS p_name TYPE c LENGTH 10 DEFAULT 'mytab'.
SELECTION-SCREEN SKIP.
PARAMETERS: p_create RADIOBUTTON GROUP grp,
p_insert RADIOBUTTON GROUP grp,
p_select RADIOBUTTON GROUP grp,
p_drop RADIOBUTTON GROUP grp.
SELECTION-SCREEN SKIP.
PARAMETERS p_key TYPE i DEFAULT 1.
CLASS adbc DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
PRIVATE SECTION.
CLASS-DATA: dbname TYPE string,
sql TYPE REF TO cl_sql_statement,
wa1 TYPE c LENGTH 10,
wa2 TYPE c LENGTH 10,
err TYPE REF TO cx_sql_exception .
CLASS-METHODS: create RAISING cx_sql_exception,
insert RAISING cx_sql_exception,
select RAISING cx_sql_exception,
drop RAISING cx_sql_exception.
ENDCLASS.
CLASS adbc IMPLEMENTATION.
METHOD main.
dbname = 'ABAP_DOCU_DEMO_' && p_name.
TRY.
CREATE OBJECT sql.
IF p_create = 'X'.
create( ).
MESSAGE 'Create was successful' TYPE 'S'.
ELSEIF p_insert = 'X'.
insert( ).
MESSAGE 'Insert was successful' TYPE 'S'.
ELSEIF p_select = 'X'.
select( ).
MESSAGE 'Select was successful' TYPE 'S'.
ELSEIF p_drop = 'X'.
drop( ).
MESSAGE 'Drop was successful' TYPE 'S'.
ENDIF.
CATCH cx_sql_exception INTO err.
MESSAGE err TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
METHOD create.
sql->execute_ddl(
`CREATE TABLE ` && dbname &&
`( val1 char(10) NOT NULL,` &&
` val2 char(10) NOT NULL,` &&
` PRIMARY KEY (val1) )` ).
ENDMETHOD.
METHOD insert.
DO 100 TIMES.
wa1 = sy-index.
wa2 = sy-index ** 2.
sql->execute_update(
`INSERT INTO ` && dbname && ` ` &&
`VALUES ('` && wa1 && `','` && wa2 && `')` ).
ENDDO.
ENDMETHOD.
METHOD select.
DATA: result TYPE REF TO cl_sql_result_set,
msg TYPE c LENGTH 30,
key TYPE c LENGTH 10,
dref TYPE REF TO data,
rc TYPE i.
key = p_key.
result = sql->execute_query(
`SELECT val1, val2 ` &&
`FROM ` && dbname && ` ` &&
`WHERE val1 = ` && `'` && key && `'` ).
GET REFERENCE OF wa1 INTO dref.
result->set_param( dref ).
GET REFERENCE OF wa2 INTO dref.
result->set_param( dref ).
rc = result->next( ).
IF rc > 0.
WRITE: 'Result:' TO msg,
wa1 TO msg+10,
wa2 TO msg+20.
ELSE.
msg = 'No entry found'.
ENDIF.
result->close( ).
MESSAGE msg TYPE 'I'.
ENDMETHOD.
METHOD drop.
sql->execute_ddl(
`DROP TABLE ` && dbname ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
adbc=>main( ).
样例二、参数绑定样例
REPORT demo_adbc_ddl_dml_binding.
PARAMETERS p_name TYPE c LENGTH 10 DEFAULT 'mytab'.
SELECTION-SCREEN SKIP.
PARAMETERS: p_create RADIOBUTTON GROUP grp,
p_insert RADIOBUTTON GROUP grp,
p_select RADIOBUTTON GROUP grp,
p_drop RADIOBUTTON GROUP grp.
SELECTION-SCREEN SKIP.
PARAMETERS p_key TYPE i DEFAULT 1.
CLASS adbc DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
PRIVATE SECTION.
CLASS-DATA: dbname TYPE string,
sql TYPE REF TO cl_sql_statement,
wa1 TYPE c LENGTH 10,
wa2 TYPE c LENGTH 10,
err TYPE REF TO cx_sql_exception .
CLASS-METHODS: create RAISING cx_sql_exception,
insert RAISING cx_sql_exception,
select RAISING cx_sql_exception,
drop RAISING cx_sql_exception.
ENDCLASS.
CLASS adbc IMPLEMENTATION.
METHOD main.
dbname = 'ABAP_DOCU_DEMO_' && p_name.
TRY.
CREATE OBJECT sql.
IF p_create = 'X'.
create( ).
MESSAGE 'Create was successful' TYPE 'S'.
ELSEIF p_insert = 'X'.
insert( ).
MESSAGE 'Insert was successful' TYPE 'S'.
ELSEIF p_select = 'X'.
select( ).
MESSAGE 'Select was successful' TYPE 'S'.
ELSEIF p_drop = 'X'.
drop( ).
MESSAGE 'Drop was successful' TYPE 'S'.
ENDIF.
CATCH cx_sql_exception INTO err.
MESSAGE err TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
METHOD create.
sql->execute_ddl(
`CREATE TABLE ` && dbname &&
`( val1 char(10) NOT NULL,` &&
` val2 char(10) NOT NULL,` &&
` PRIMARY KEY (val1) )` ).
ENDMETHOD.
METHOD insert.
DATA dref TYPE REF TO data.
DO 100 TIMES.
GET REFERENCE OF wa1 INTO dref.
sql->set_param( dref ).
GET REFERENCE OF wa2 INTO dref.
sql->set_param( dref ).
wa1 = sy-index.
wa2 = sy-index ** 2.
sql->execute_update(
`INSERT INTO ` && dbname && ` VALUES (?,?)` ).
ENDDO.
ENDMETHOD.
METHOD select.
DATA: result TYPE REF TO cl_sql_result_set,
msg TYPE c LENGTH 30,
key TYPE c LENGTH 10,
dref TYPE REF TO data,
rc TYPE i.
key = p_key.
GET REFERENCE OF key INTO dref.
sql->set_param( dref ).
result = sql->execute_query(
`SELECT val1, val2 ` &&
`FROM ` && dbname && ` ` &&
`WHERE val1 = ?` ).
GET REFERENCE OF wa1 INTO dref.
result->set_param( dref ).
GET REFERENCE OF wa2 INTO dref.
result->set_param( dref ).
rc = result->next( ).
IF rc > 0.
WRITE: 'Result:' TO msg,
wa1 TO msg+10,
wa2 TO msg+20.
ELSE.
msg = 'No entry found'.
ENDIF.
result->close( ).
MESSAGE msg TYPE 'I'.
ENDMETHOD.
METHOD drop.
sql->execute_ddl(
`DROP TABLE ` && dbname ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
adbc=>main( ).
样例三、存储过程调用
REPORT demo_adbc_stored_procedure.
PARAMETERS incprice TYPE sflight-price.
CLASS demo DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
ENDCLASS.
CLASS demo IMPLEMENTATION.
METHOD main.
DATA: sql TYPE REF TO cl_sql_statement,
err TYPE REF TO cx_sql_exception,
dref TYPE REF TO data.
CREATE OBJECT sql.
TRY.
sql->execute_ddl(
`CREATE OR REPLACE PROCEDURE increase_price (x IN NUMBER) IS `
&& `BEGIN `
&& `UPDATE sflight SET price = price + x`
&& ` WHERE mandt = '` && sy-mandt && `'; `
&& `END;` ).
GET REFERENCE OF incprice INTO dref.
sql->set_param( data_ref = dref
inout = cl_sql_statement=>c_param_in ).
sql->execute_procedure( proc_name = 'increase_price' ).
CATCH cx_sql_exception INTO err.
MESSAGE err TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
INITIALIZATION.
IF sy-dbsys <> 'ORACLE'.
MESSAGE 'Example is only for Oracle SQL' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
START-OF-SELECTION.
demo=>main( ).
样例四、动态查询样例,参见sap程序ADBC_QUERY
以上代码都是从sap帮助文档摘抄。
相关连接:http://help.sap.com/abapdocu_70/en/ABENADBC.htm
相关文章推荐
- ABAP--原生SQL接口API(ADBC)的使用
- ABAP--原生SQL接口API(ADBC)的使用
- ABAP--原生SQL接口API(ADBC)的使用
- ABAP--原生SQL接口API(ADBC)的使用
- 使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库
- ThinkPHP中如何使用原生SQL【原创】
- iOS使用sqlite3原生语法进行增删改查以及FMDB的使用
- 在ThinkPhp 中使用原生的 带条件查询 + 分页
- 使用jQuery.makeArray() 将多种类型转换成JS原生Array
- 简单修改Hibernate源码,增加使用原生SQL查询时动态addEntity和addScalar功能
- 第16章 使用Kotlin Native开发原生应用《Kotin 编程思想·实战》
- SAP ABAP Texteditor使用实例
- 使用原生JDBC从数据库读取数据并且封装
- [Flash/Flex] [新闻资讯] 使用flash player的原生光标功能(10.2版本)
- android WebView的使用,js与原生交互
- BW中使用abap
- ABAP里面游标的使用
- 在windows phone 中使用原生代码开发程序(native code)
- sap abap 程序 中使用 FTP . <转载>
- 实例讲解使用原生JavaScript处理AJAX请求的方法