2012-02-28 46 views
1

如何我下面的T-SQL语句转换为PL/SQL转换T-SQL到PL/SQL

set @disbursement_no = (select isnull(max(convert(numeric, right(DV_NO, 6))), 0) + 1 
      from CD_T_DV_HDR where year(DATE_DV) = year(getdate())) 

DV_NO的数据类型为varchar和Date_Dv是日期。

我对PL/SQL非常陌生,而且我很难将我的SQL语句转换为PL/SQL。我希望你能帮助我。

回答

3

这将是这样的:

DECLARE 
    disbursement_no NUMBER; 
BEGIN 
    SELECT (coalesce(MAX(To_number(Substr(dv_no, -6, 6))), 0)) + 1 
    INTO disbursement_no 
    FROM cd_t_dv_hdr 
    WHERE To_char(date_dv, 'rrrr') = To_char(SYSDATE, 'rrrr'); 
END; 

Substr(dv_no, -6, 6)获取最右边的6个字符。 to_number将字符串转换为数字。 max提取最大编号& coalesce检查结果编号是否为空&将其转换为零。

+0

非常感谢你.... – 2012-02-29 01:59:59

-1
DECLARE 
    disbursement_no int; 
BEGIN 
    select (case when DV_NO is null 0 else max(to_number(right(DV_NO,6),'999999')) end)+1 into disbursement_no 
    from CD_T_DV_HDR 
    where extract(year from DATE_DV) = extract(year from current_date); 
END; 

我觉得这样做可以。我确信还有其他方法,在postgresql中可能有相当于isnull(),但如果有的话我不知道。显然你需要其余的功能,包括一些返回等。

还值得注意的是,PostgreSQL中的文本类型比其他系统中的文本类型更加智能,并且varchar通常可以被文本替换,除非存在是特别的考虑。

而且,如果这是一个频繁的查询,你可以在where子句创建索引:

create index my_year_index on CD_T_DV_HDR (extract(year from DATE_DV)); 

这是PostgreSQL的的非常好的特性之一:基于表达式创建索引。

+1

Postgres的使用功能-bad想法在90%的情况下 2.使用之间? PL/SQL是Oracle的扩展 - [Postgres'是PL/pgSQL](http://en.wikipedia.org/wiki/PL/pgSQL) – Sathya 2012-02-28 04:39:15

0

有关@Sathya的一点评论: DATE_DV被索引/用作分区键列的情况Oracle不会使用索引/分区,因为您在该列上有一个函数。 这将导致整个桌面上的全表扫描,这将是不好的。

你有2个选项:1。 更改索引/分区你在哪里条件

SELECT (coalesce(MAX(To_number(Substr(dv_no, -6, 6))), 0)) + 1 
INTO disbursement_no 
FROM cd_t_dv_hdr 
WHERE date_dv between trunc(sysdate,'rrrr') and trunc(add_months(sysdate,12),'rrrr')