【问题标题】:How to convert procedure from SQL Server into Oracle?如何将程序从 SQL Server 转换为 Oracle?
【发布时间】:2015-11-12 13:46:25
【问题描述】:

我是甲骨文的新手。我想从 SQL Server 转换一个过程。

这是我的程序

ALTER PROCEDURE [dbo].[GETMONITORING]
    @namabarang varchar (max)=null,
    @PeriodeAwal varchar (max)=null,
    @PeriodeAkhir varchar (max)=null,
    @JenisLayanan varchar (max)=null
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE 
        @nWhere varchar(4000),
        @Select varchar(4000),
        @from varchar(4000),
        @Where varchar(4000),
        @final varchar (4000)

    SET @Select = 'select * '
    SET @from = 'from table  '
    SET @where = 'where 1=1'

    IF isnull(len(@namabarang), 0) <> 0
       SET @where = ISNULL(@where, '') + ' and namabarang like ''' + ISNULL(@namabarang, '') + ''' '

    IF isnull(len(@JenisLayanan), 0) <> 0
       SET @where = ISNULL(@where, '') + 'and jenislayananid like ''' + ISNULL(@JenisLayanan, '') + ''' '

    IF isnull(len(@PeriodeAwal), 0) <> 0 and isnull(len(@PeriodeAkhir), 0) <> 0
       SET @where = ISNULL(@where, '') + ' and tanggalpermohonan between ' + @PeriodeAwal + ' and ' + @PeriodeAkhir

    SET @final = @Select + @from + @where

    execute (@final)
END

我已尝试转换为 Oracle。这是我在 Oracle 中的存储过程

create or replace PROCEDURE GETMONITORING
(
    v_namabarang in varchar2 default null,
    v_JenisLayanan in varchar2 default null
)
AS
  v_where  VARCHAR2(200);
  v_Select VARCHAR2(200);
  v_from   VARCHAR2(200);
  v_final  VARCHAR2(200);
  v_result VARCHAR2(200);
BEGIN
  v_Select := 'select * ';
  v_from   := 'from permohonan ';
  v_where  := 'where sysdate=sysdate ';

  if namabarang is not null
     then v_where := v_where || ' and namabarang like '%' || v_namabarang || '%'';

  if jenislayanan is not null
     then v_where := v_where || 'and jenislayanan='||v_jenislayanan ;

  v_final := v_select || v_from || v_where;

  EXECUTE immediate v_final INTO v_result;

  dbms_output.put_line(v_result);
END;

当我编译那个存储过程时,我得到一个错误:

错误(37,50):PLS-00103:在预期以下之一时遇到符号“%”:* & = - + ; > at in is mod 余数 not rem or != or ~= >= and or like2 like4 likec ||成员子集

你能帮我解决这个问题吗?

我在 Oracle 中的存储过程在逻辑上是否正确?

如何在 sqlplus 中调用该存储过程?

谢谢

【问题讨论】:

  • 我认为您需要转义 '%' 中的单引号,即改用 ''%''。
  • IF 块必须用end if“关闭”

标签: sql-server oracle stored-procedures


【解决方案1】:

您缺少围绕常量的额外单引号:

if namabarang is not null then
    v_where :=v_where || ' and namabarang like ''%' || v_namabarang || '%';
end if;
if jenislayanan is not null then
    v_where :=v_where || ' and jenislayanan = '''|| v_jenislayanan || '''';
end if;

【讨论】:

  • @AufalAhdy - 第二行末尾有一个额外的单引号,现已更正。再试一次。
  • @BobJarvis 我又试了一次。复制粘贴。结果 "Error(53,4): PLS-00103: Encountered the symbol ";" 当期望以下之一时:如果 "
  • 啊 - 看起来您需要两条 END IF; 行,一条在 if jenislayanan... 之前,另一条在上述片段的末尾。在 PL/SQL 中,每个 IF 都需要一个 END IF;,因为 PL/SQL 是基于 Ada 而不是 C。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2022-01-13
  • 2011-04-03
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多