Oracle到DB2,如何做到

时间:2018-01-09 18:49:49

标签: sql oracle db2

我得到了下面的询问,首先,下面的内容是什么意思:

Create or replace FUNCTION GPRS7003(
    -->> In Parameters --
    pe_sTexto       VARCHAR2,
    pe_sDelimitador VARCHAR2
) RETURN VARCHAR2 IS

    -->> Variáveis <<--
    v_sRetorno VARCHAR2(32767);

    -->> Cursor de Seleção de Partições da Variável <<--
    CURSOR CUR_RETORNO_PARTICOES IS  
        SELECT DISTINCT(t.V_SCOLUNA) AS PARTICAO
          FROM (SELECT *
                  FROM TABLE(GPRSG001.GPRS7001(pe_sTexto,
                                               pe_sDelimitador))) t;

-->> Início - Função para Retornar Variável Particionada Distinta <<--
BEGIN
    -->> Passando pelo Cursor de Seleção de Partições da Variável <<--
    FOR c_retorno_particoes IN CUR_RETORNO_PARTICOES LOOP
        -->> Checando se é a Primeira Partição <<--
        IF (v_sRetorno IS NULL) THEN
            -->> Gerando a String de Retorno <<--
            v_sRetorno := c_retorno_particoes.PARTICAO;
        ELSE
            -->> Gerando a String de Retorno <<--
            v_sRetorno := (v_sRetorno || pe_sDelimitador || c_retorno_particoes.PARTICAO);
        END IF; -->> Fim - Checando se é a Primeira Partição <<--
    END LOOP; -->> Passando pelo Cursor de Seleção de Partições da Variável <<--
    -->> Retornando as Partições <<--
    RETURN v_sRetorno;
END GPRS7003;

我不知道什么 FOR c_retorno_particoes IN CUR_RETORNO_PARTICOES LOOP 意味着,我也不知道在Cursor中有很大的背景。

其实我喜欢某人解释另一种摆脱游标的方法并使用transact -sql

我尝试在DB2数据库中使用那个,但是在DB2 V11.1中,sintaxy无法识别。我也启用了ORA兼容性。

如果有人解释或给我一个使用游标的例子

会很棒

谢谢

3 个答案:

答案 0 :(得分:2)

关于您对Db2中PL / SQL仿真的观察的评论。你写道:

  

我不知道FOR c_retorno_particoes IN CUR_RETORNO_PARTICOES是什么   循环意味着,我也不知道在Cursor中有巨大的背景。 ...

     

我尝试在DB2数据库中使用那个,但是sintaxy没有   在DB2 V11.1中认识到。我也启用了ORA兼容性   ....

这个PL / SQL游标的Oracle语法是:for record in cursor-name loop...

该语法在Oracle documentation中描述。

Linux上的My Db2 V11.1在正确启用Oracle兼容性时支持此Oracle语法。如果您的安装拒绝此Oracle语法,那么您必须在Db2配置上犯了一些错误。一个常见的错误是DB2_COMPATIBILITY_VECTOR = ORA变量在创建Db2数据库之前无效。

Db2当前不支持Oracle语法中的所有内容,但这种形式的游标似乎是正确模拟的。

答案 1 :(得分:1)

对于此查询中的每一行,句子for c_retorno_particoes in CUR_RETORNO_PARTICOES LOOP将运行一次(循环):

SELECT DISTINCT(t.V_SCOLUNA) AS PARTICAO
  FROM (SELECT * FROM TABLE(GPRSG001.GPRS7001(pe_sTexto, pe_sDelimitador))) t;

在每次运行(循环)时,该行将通过名为c_retorno_particoes的变量提供。

所以,假设你想要将每个PARTICAO值“打印”到控制台,你可以这样做:

for c_retorno_particoes in CUR_RETORNO_PARTICOES LOOP
    dbms_output.put_line(c_retorno_particoes.PARTICAO);
end loop;

答案 2 :(得分:1)

这更多是评论而不是答案,但评论时间太长了。

首先要看的是 GPRSG001.GPRS7001 。这是一个获取文本和分隔符并返回行的函数。我想它是它返回的单独单词,即来自文本'abc def abc ghi'和分隔符' ',它将获得值'abc''def',{{1 }和'abc'

您显示的功能有一个光标,可以从上面选择不同的值,即'ghi''abc''def'。然后在循环中,这些再次与相同的分隔符合并,因此我们最终得到'ghi'(或'abc def ghi'或任何其他顺序,因为没有指定'ghi abc def'子句

Oracle的PL / SQL是一种与数据库密切配合的编程语言。我不认为DB2有这样的东西,但我实际上并不知道。您可能必须编写递归查询来获取单个单词,然后使用ORDER BY将不同的单词组合成新的字符串。