zoukankan      html  css  js  c++  java
  • Native SQL

    Native SQL允许你针对数据库来使用原生的SQL,这些SQL可能是标准的SQL,也可以是某数据库特定的SQL。如果使用database-specific SQL语句,则数据库不能更换,否则请使用Open SQL

     

    本地SQL会绕过R/3 database interface,操作时不会记录日志,不会同步应用服务器上的database buffer。另外,使用ABAP Dictionary定义的类型为LCHR or LRAW的长列时,这些列需要使用Open SQL来读取,因为读取这些字段时,还需要使用另外存储此类型长列的长度信息,才能准确读出。最后,本地SQL是不会自动能客户端字段MANDT字段进行处理,该字段会像普通字段那样对待。

     

    为了事务的一致性,在本地SQL中不要使用事务控制的语句(如COMMIT, ROLLBACK WORK),以及事务设置语句(如级别设置)

     

    普通SQL

    EXEC SQL [PERFORMING <form>].
    <Native SQL statement>[;]

    ENDEXEC.

    Native SQL statement后面的分号是可选的,但不能是“.

    如果Native SQL 是一个从表里SELECT statement时,你可以通过PERFORMING选项的<form>里来一行行读取,如果不需要处理返回结果,或者是UPDATEDELETE语句时,可以省略选项。

    ENDEXEC执行完后,SY-DBCNT存储了处理的数据行数。在几乎所有情况下,在执行ENDEXEC 后,SY-SUBRC都会为0,但是游标除外After FETCH之后,如果没有读取到数据,SY-SUBRC将会为4

     

    DATA: BEGIN OF wa,
      connid
    TYPE spfli-connid,
      cityfrom
    TYPE spfli-cityfrom,
      cityto
    TYPE spfli-cityto,
    END OF wa.
    DATA c1 TYPE spfli-carrid VALUE 'LH'.

    "Native SQL语句不能以句点号结尾

    "不能在EXEC SQL…ENDEXEC间有注释,即不能有星号与双引号的出现;

    "另外还要注意数据库系统大小写是否敏感

    "参数占位符使用冒号,而不是问号;
    EXEC SQL PERFORMING loop_output.
     
    SELECT connid, cityfrom, cityto
       
    INTO :wa
       
    FROM spfli
       
    WHERE carrid
    = :c1
    ENDEXEC.
    FORM loop_output.
     
    WRITE: / wa-connid, wa-cityfrom, wa-cityto.
    ENDFORM

     

    或者将上面的INTO :wa替换为:

    INTO :wa-connid ,:wa-cityfrom ,:wa-cityto

    也可以。

     

    image210

    调用存储过程

    EXECUTE PROCEDURE<name> ( <parameter list> )

    参数以逗号分隔,并需要INOUT 来指定是输入还是输出参数,或者是使用INOUT来表示即是输入也是输出参数

    EXEC SQL.
     
    EXECUTE PROCEDURE proc1 ( IN :x, OUT :y )
    ENDEXEC.

    游标处理:

    OPEN<cursor name>FOR<statement>

    FETCH NEXT <cursor name>INTO<target(s)>.

    CLOSE<cursor name>

     

    DATA: arg1 TYPE string VALUE '800'.
    TABLES: t001.
    "打开游标
    EXEC SQL.
     
    OPEN c1 FOR SELECT MANDT, BUKRS FROM T001
                 
    WHERE MANDT = :arg1 AND BUKRS >= 'ZA01'

    ENDEXEC.
    DO.
      "读取游标
     
    EXEC SQL.
       
    FETCH NEXT c1 INTO :t001-mandt, :t001-bukrs
     
    ENDEXEC.

     
    IF sy-subrc <> 0.
       
    EXIT.
     
    ELSE.
       
    WRITE: / t001-mandt, t001-bukrs.
     
    ENDIF.
    ENDDO.
    "关闭游标
    EXEC SQL.
     
    CLOSE
    c1
    ENDEXEC
    .

  • 相关阅读:
    Windows平台下Glade+GTK开发环境的搭建
    uCOSII移植STM32F10x_Keil
    C语言中的内存管理与双向链表
    Windows平台下Glade+GTK实现多线程界面的探讨
    C语言中可变形参个数的函数实现
    从STM32的位带操作重谈嵌入式中寻址与对齐的理解
    uCOSII的中断ARM7实现中断嵌套的方法探究
    uCOSII中的内存管理C语言构建完整的微型动态内存管理机制
    uCOSII中的任务切换图解多种任务调度时机与问题
    uCOSII中的任务切换机制
  • 原文地址:https://www.cnblogs.com/jiangzhengjun/p/4293506.html
Copyright © 2011-2022 走看看