Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle函数从查询中选择*不提供任何结果_Oracle_Plsql_Oracle11g - Fatal编程技术网

Oracle函数从查询中选择*不提供任何结果

Oracle函数从查询中选择*不提供任何结果,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,以下是我正在使用的函数定义: CREATE OR REPLACE FUNCTION MA_FACTSET.totalCustomers RETURN number as total INTEGER := 0; FID VARCHAR2(30) := 'NT33H0-S-US'; stmt varchar2(1000); BEGIN execute immediate 'TRUNCATE TABLE MovingAverage'; execute imme

以下是我正在使用的函数定义:

CREATE OR REPLACE FUNCTION MA_FACTSET.totalCustomers
RETURN number as
    total INTEGER := 0;
    FID VARCHAR2(30) := 'NT33H0-S-US';
    stmt varchar2(1000);

BEGIN
    execute immediate 'TRUNCATE TABLE MovingAverage';
    execute immediate 'DROP TABLE MovingAverage';
    execute immediate 'CREATE GLOBAL TEMPORARY TABLE MovingAverage
    (ID INTEGER,
     PDATE DATE,
     PPRICE FLOAT,
     MA1 FLOAT) ON COMMIT PRESERVE ROWS';

    stmt := 'INSERT INTO  MovingAverage (ID,PDATE,PPRICE) SELECT 
    ROWNUM,"DATE",P_PRICE FROM FP_BASIC_BD WHERE FS_PERM_SEC_ID = ''NT33H0-S-US''';
    DBMS_OUTPUT.PUT_LINE(stmt);
    execute immediate stmt;
    dbms_output.put_line(SQL%ROWCOUNT);
    commit;

    execute immediate 'UPDATE  MovingAverage A SET MA1 =(SELECT AVG(PPRICE) 
    FROM MovingAverage WHERE ID>=A.ID-5 AND ID<A.ID )' ;
    dbms_output.put_line(SQL%ROWCOUNT);
    commit;

    execute immediate 'SELECT * FROM MovingAverage ORDER BY ID ASC';
    dbms_output.put_line(SQL%ROWCOUNT);
    commit;

    dbms_output.put_line(total);
    RETURN total;
END;
/  

我想知道为什么“
SELECT*FROM MovingAverage ORDER BY ID ASC
”的行数为0。以及是否有任何方法可以在数据网格中打印完整的表。我正在使用TOAD for Oracle。

我建议您重写函数,在不需要的地方删除动态SQL。另外,若您有DDL,DML不使用PL/SQL函数,而是使用过程

对于
executeimmediate
中的
select
语句,如果使用
BULK COLLECT to

CREATE OR REPLACE FUNCTION totalCustomers
   RETURN NUMBER
AS
   total   INTEGER := 0;
   FID     VARCHAR2 (30) := 'NT33H0-S-US';
   stmt    VARCHAR2 (1000);

   TYPE mrectype IS TABLE OF MovingAverage%ROWTYPE;

   mrec    mrectype;
BEGIN
   EXECUTE IMMEDIATE 'TRUNCATE TABLE MovingAverage';

   EXECUTE IMMEDIATE 'DROP TABLE MovingAverage';

   EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE MovingAverage
(ID INTEGER,
 PDATE DATE,
 PPRICE FLOAT,
 MA1 FLOAT) ON COMMIT PRESERVE ROWS';

   stmt :=
      'INSERT INTO  MovingAverage (ID,PDATE,PPRICE) SELECT 
ROWNUM,"DATE",P_PRICE FROM FP_BASIC_BD WHERE FS_PERM_SEC_ID = ''NT33H0-S-US''';
   DBMS_OUTPUT.PUT_LINE (stmt);

   EXECUTE IMMEDIATE stmt;

   DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
   COMMIT;

   EXECUTE IMMEDIATE 'UPDATE  MovingAverage A SET MA1 =(SELECT AVG(PPRICE) 
FROM MovingAverage WHERE ID>=A.ID-5 AND ID<A.ID )';

   DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
   COMMIT;

   EXECUTE IMMEDIATE 'SELECT * FROM MovingAverage ORDER BY ID ASC'
      BULK COLLECT INTO mrec;

   DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
   COMMIT;
   DBMS_OUTPUT.put_line (total);
   RETURN total;
END;
/

您不能在SQL
select

中调用函数。我建议您重写函数,在不需要的地方删除动态SQL。另外,若您有DDL,DML不使用PL/SQL函数,而是使用过程

对于
executeimmediate
中的
select
语句,如果使用
BULK COLLECT to

CREATE OR REPLACE FUNCTION totalCustomers
   RETURN NUMBER
AS
   total   INTEGER := 0;
   FID     VARCHAR2 (30) := 'NT33H0-S-US';
   stmt    VARCHAR2 (1000);

   TYPE mrectype IS TABLE OF MovingAverage%ROWTYPE;

   mrec    mrectype;
BEGIN
   EXECUTE IMMEDIATE 'TRUNCATE TABLE MovingAverage';

   EXECUTE IMMEDIATE 'DROP TABLE MovingAverage';

   EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE MovingAverage
(ID INTEGER,
 PDATE DATE,
 PPRICE FLOAT,
 MA1 FLOAT) ON COMMIT PRESERVE ROWS';

   stmt :=
      'INSERT INTO  MovingAverage (ID,PDATE,PPRICE) SELECT 
ROWNUM,"DATE",P_PRICE FROM FP_BASIC_BD WHERE FS_PERM_SEC_ID = ''NT33H0-S-US''';
   DBMS_OUTPUT.PUT_LINE (stmt);

   EXECUTE IMMEDIATE stmt;

   DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
   COMMIT;

   EXECUTE IMMEDIATE 'UPDATE  MovingAverage A SET MA1 =(SELECT AVG(PPRICE) 
FROM MovingAverage WHERE ID>=A.ID-5 AND ID<A.ID )';

   DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
   COMMIT;

   EXECUTE IMMEDIATE 'SELECT * FROM MovingAverage ORDER BY ID ASC'
      BULK COLLECT INTO mrec;

   DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
   COMMIT;
   DBMS_OUTPUT.put_line (total);
   RETURN total;
END;
/

不能在SQL
select

中调用函数。使用collections和table函数,函数可以返回可在SQL语句中查询的表。下面的示例演示了这一点

首先创建记录类型变量。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;
创建基于记录类型变量的表类型变量。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;
然后我们可以继续创建一个函数,如下所示。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;
有关更多详细信息和工作的进一步扩展,请参考以下URL。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;


使用集合和表函数,函数可以返回可以在SQL语句中查询的表。下面的示例演示了这一点

首先创建记录类型变量。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;
创建基于记录类型变量的表类型变量。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;
然后我们可以继续创建一个函数,如下所示。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;
有关更多详细信息和工作的进一步扩展,请参考以下URL。

create or replace type t_record as object (i number,n varchar2(30));
create or replace type t_table as table of t_record;
create or replace function return_table return t_table as
  v_ret   t_table;
begin

 --
 -- Call constructor to create the returned
 -- variable:
 --
v_ret  := t_table();

 --
 -- Add one record after another to the returned table.
 -- Note: the »table« must be extended before adding
 -- another record:
 --
    v_ret.extend; v_ret(v_ret.count) := t_record(1, 'one'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(2, 'two'  );
    v_ret.extend; v_ret(v_ret.count) := t_record(3, 'three');

 --
 -- Return the record:
 --
    return v_ret;

end return_table;



您创建了一个表,但没有删除它,因此,除非我遗漏了某些内容,否则在您第二次调用该函数时,它将失败。最好是在部署时而不是在运行时创建所需的表。@William Robertson我创建了一个GTT,这样我就不会浪费空间。GTT不使用时不会占用任何空间。即使是普通的表,空时也只占用很少的空间。我不会担心的。你创建了一个表,但你不会丢弃它,所以除非我遗漏了什么,否则在你第二次调用函数时它会失败。最好是在部署时而不是在运行时创建所需的表。@William Robertson我创建了一个GTT,这样我就不会浪费空间。GTT不使用时不会占用任何空间。即使是普通的表,空时也只占用很少的空间。我不担心,谢谢你的回复。这对我有用@KaushikNayak令人敬畏的回答。我想打印“mrec”中的行数。请帮我解决这个问题。@ShekharNalawade:你能详细说明你的问题吗
SQL%ROWCOUNT
已经提供了记录数,对吗<代码>mrec是一个集合。因此,要计算
mrec
中的行数,可以使用
mrec.count
`如果你想获取集合中的记录,你需要遍历它。明白你的意思了。帮了大忙。我试图将此函数称为SELECT totalCustomers FROM DUAL;但得到如下错误:-ORA-14552:无法在查询或DML ORA-06512中执行DDL、提交或回滚ORA-06512:在“MA_FACTSET.TOTALCUSTOMERS”第12行,我将在excel VBA中使用它,因此函数从select语句运行对我来说很重要。我如何在excel VBA中使用它。被调用函数的常规语法是select function_nnem from dual;我可以在excel VBA中使用,而不是你说的那个。@ShekharNalawade:你可以作为一个单独的问题来问vb,并从VBA专家那里得到答案。谢谢你的回答。这对我有用@KaushikNayak令人敬畏的回答。我想打印“mrec”中的行数。请帮我解决这个问题。@ShekharNalawade:你能详细说明你的问题吗
SQL%ROWCOUNT
已经提供了记录数,对吗<代码>mrec是一个集合。因此,要计算
mrec
中的行数,可以使用
mrec.count
`如果你想获取集合中的记录,你需要遍历它。明白你的意思了。帮了大忙。我试图将此函数称为SELECT totalCustomers FROM DUAL;但得到如下错误:-ORA-14552:无法在查询或DML ORA-06512中执行DDL、提交或回滚ORA-06512:在“MA_FACTSET.TOTALCUSTOMERS”第12行,我将在excel VBA中使用它,因此函数从select语句运行对我来说很重要。我如何在excel VBA中使用它。被调用函数的常规语法是select function_nnem from dual;我可以在excel VBA中使用,而不是您所说的。@ShekharNalawade:您可以作为一个单独的问题来提问,并从VBA专家那里获得答案。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-按照您的建议进行了更改。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-按照您的建议进行了更改。