You are browsing the archive for SQL.

在Report中取得帐户描述(2)

九月 26, 2008 in Oracle EBS二次开发

 

本文介绍通过SQL语句取得账户段值对应的描述。

 

编写SQL的思路

 

  1. 通过预制文件取得当前的帐簿信息
  2. 通过表gl_set_of_books表取得帐户结构ID
  3. 根据结构ID从弹性域相关表中取得段值的描述
  4. 并根据帐户段的设置来连接段

 

编写SQL来取得段的描述存在如下的问题

 

  1. SQL相对复杂
  2. 如果帐户段之间存在依赖关系就比较麻烦
  3. 写出的SQL移植性差
  4. SQL性能容易出现瓶颈

 

下面是取得一个段值描述的SQL语句

 

SELECT DESCRIPTION

FROM FND_FLEX_VALUES_VL B

WHERE B.FLEX_VALUE = 代码

AND EXISTS( SELECT NULL

                       FROM FND_ID_FLEX_SEGMENTS_VL D,

                                 GL_SETS_OF_BOOKS E

                     WHERE D.ID_FLEX_CODE = ‘GL#’

                         AND D.ID_FLEX_NUM = E.CHART_ACCOUNT_ID

                         AND E.SET_OF_BOOK_ID=预置文件GL_SET_OF_BKS_ID

                         AND D.APPLICATION_COLUMN_NAME=SEGMENT?

                         AND D.FLEX_VALUE_SET_ID= B.FLEX_VALUE_SET_ID)

 

其中SEGMENT? 代表了需要取得第几段的值,如果是第一段则为 SEGMENT1 ,依次类推;‘GL#’是帐户关键性弹性域的代码

 

如果是从属段,还需要添加额外一个条件:

 

SELECT DESCRIPTION

  FROM FND_FLEX_VALUES_VL B

WHERE B.FLEX_VALUE = 代码

   AND B.PARENT_FLEX_VALUE_LOW = 父段的代码

 

虽然在报表中我们推荐使用USER_EXIT的方式取得关键性弹性域的段值描述,但是上面的SQL在一些场合下也会使用到。

Oracle SQL 空值排序(Nulls)

九月 12, 2008 in Oracle EBS基础

 

在数据开发应用中,很多时候需要对数据进行排序,但是在Oracle 数据库中,有空值一说(NULL)。如果一个列中有的值是空的,则如果对此列进行排序的话,空值的行将被排序放到后面,如我对HR模式下的EMPLOYEES员工表按照佣金比率列进行排序的话,

SELECT t.employee_id, t.last_name, t.commission_pct
FROM employees t
WHERE t.employee_id BETWEEN 178 AND 181
ORDER BY t.commission_pct

 

结果如下:

179 Johnson 0.10
178 Grant 0.15
180 Taylor
181 Fleaur

 

180,181由于没有佣金比率被排到了后面
而有的时候我们希望将空值的记录排序在前面而不是后面 ,这时候则需要使用关键字:
NULLS FIRST :将空值的记录排序在前面
NULLS LAST:将空值的记录排序在后面(默认)

 

例如上面的例子做少许的修改:

SELECT t.employee_id, t.last_name, t.commission_pct
FROM employees t
WHERE t.employee_id BETWEEN 178 AND 181
ORDER BY t.commission_pct NULLS FIRST

 

结果如下:

180 Taylor
181 Fleaur
179 Johnson 0.10
178 Grant 0.15

180,181由于没有佣金比率被排到了前面