我得到了下面的询问,首先,下面的内容是什么意思:
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兼容性。
如果有人解释或给我一个使用游标的例子
会很棒谢谢
答案 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
将不同的单词组合成新的字符串。