oracle中的过程输出大小

时间:2014-06-01 20:58:41

标签: oracle zend-framework plsql zend-framework2 oracle-sqldeveloper

我有我的程序:

create or replace 
PROCEDURE wypiszZamienniki (z_bloz12 IN NUMBER ,output OUT VARCHAR2)
as
LV_TEST_CUR SYS_REFCURSOR;
BEGIN
IF (z_bloz12 IS NOT NULL) THEN
FOR CUR_VAR IN (SELECT p.* 
            FROM produkt p join produkt p2 on p.nazwa_miedz = p2.nazwa_miedz
            and (p.dawka_l_p like p2.dawka_l_p or
                 p.dawka_l_p is NULL and p2.dawka_l_p is NULL)
            and (p.dawka_j_p = p2.dawka_j_p or
                 p.dawka_j_p is NULL and p2.dawka_j_p is NULL)
            and (p.dawka_l_n = p2.dawka_l_n or
                 p.dawka_l_n is NULL and p2.dawka_l_n is NULL)
            and (p.dawka_j_n = p2.dawka_j_n or
                 p.dawka_j_n is NULL and p2.dawka_j_n is NULL)
            WHERE p.bloz12 != z_bloz12
            AND p2.bloz12 = z_bloz12)
  LOOP
  output := output ||CUR_VAR.nazwa || ' ' || CUR_VAR.opakowanie || ' ' || CUR_VAR.podmiot_odp;
  dbms_output.put_line(CUR_VAR.nazwa || ' ' || CUR_VAR.opakowanie || ' ' || CUR_VAR.podmiot_odp);
  end LOOP;
END IF;
END wypiszZamienniki;

执行后我得到了

ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512 

问题是输出太短。是扩展输出大小的任何方式或技巧吗?我试图将输出值设置为'short'并且它可以正常工作,但如果我添加更多字符则会抛出异常。

从ZEND Framework(PHP)调用此过程。来自控制器类的代码片段:

$db = Zend_Db_Table_Abstract::getDefaultAdapter();

$sql = 'call wypiszZamienniki( :in_param1, :get_param1)';
$parameters = array(':in_param1' => 232440132296, ':get_param1' => '');

$returndata = null;
$statement = $db->query($sql, $parameters);
$statement->bindParam(':get_param1', $returndata, PDO::PARAM_INT, 2000);
$result = $statement->execute();


Zend_Debug::dump($returndata);
$this->view->zamienniki = $returndata;

正如你所说,我无法从程序中检索出如此大的值,所以我创建了返回CURSOR的函数:

create or replace 
function wypiszZam (z_bloz12 IN NUMBER) return sys_refcursor
as
   my_cursor SYS_REFCURSOR;
BEGIN

    if (Z_BLOZ12 is not null) then
    OPEN my_cursor FOR SELECT p.* 
            FROM produkt p join produkt p2 on p.nazwa_miedz = p2.nazwa_miedz
            and (p.dawka_l_p like p2.dawka_l_p or
                 p.dawka_l_p is NULL and p2.dawka_l_p is NULL)
            and (p.dawka_j_p = p2.dawka_j_p or
                 p.dawka_j_p is NULL and p2.dawka_j_p is NULL)
            and (p.dawka_l_n = p2.dawka_l_n or
                 p.dawka_l_n is NULL and p2.dawka_l_n is NULL)
            and (p.dawka_j_n = p2.dawka_j_n or
                 p.dawka_j_n is NULL and p2.dawka_j_n is NULL)
            WHERE p.bloz12 != z_bloz12
            and P2.BLOZ12 = Z_BLOZ12;
  return my_cursor;
END IF;

END wypiszZam;

我还找到了一个从被调用过程中恢复游标的代码。问题是我无法找到从sql查询获取游标的方法。我必须做这样的事情:

declare
V_RETURN SYS_REFCURSOR;
begin
V_RETURN := WYPISZZAM(232440132296);

end;

有没有办法从sql开发人员那里测试一下?

0 个答案:

没有答案