标签: plsql

如何确定Oracle Package中的子程序类型

最好用一个例子来解释.给出以下数据库对象:

CREATE OR REPLACE PROCEDURE TEST_PROCEDURE IS
BEGIN
  NULL;
END;
/

CREATE OR REPLACE FUNCTION TEST_FUNCTION RETURN NUMBER IS
BEGIN
  RETURN NULL;
END;
/

CREATE OR REPLACE PACKAGE TEST_PACKAGE IS

  PROCEDURE TEST_PROCEDURE;
  FUNCTION TEST_FUNCTION RETURN NUMBER;

END TEST_PACKAGE;
/

CREATE OR REPLACE PACKAGE BODY TEST_PACKAGE IS

  PROCEDURE TEST_PROCEDURE IS
  BEGIN
    NULL;
  END;

  FUNCTION TEST_FUNCTION RETURN NUMBER IS
  BEGIN
    RETURN NULL;
  END;

END TEST_PACKAGE;
/
Run Code Online (Sandbox Code Playgroud)

如果我们在USERPROCEDURES中查询未打包的子程序,我们会在OBJECT_TYPE列中报告它们的类型:

但是,如果我们查询包中的子程序,我们只得到一个OBJECT_TYPE的包装,这是不是特别有用:

是否可以查询以找出实际类型而无需像通过USER_SOURCE挖掘一样?我查看了数据字典,但没有发现任何有用的东西.

谢谢你的帮助!

oracle plsql oracle11g

2
推荐指数
1
解决办法
327
查看次数

从函数oracle返回varray

我想从oracle函数返回一个varray,但是我不知道该怎么做。到目前为止,这是我尝试过的。

set serveroutput on;
declare
   type array_t is varray(2) of number;
CREATE OR REPLACE FUNCTION func() return array_t
begin
  array array_t :=array_t(0,0);   
  array(1):=3;
  array(2):=20;
  return array;
end;
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql oracle11g

2
推荐指数
1
解决办法
3968
查看次数

Pl SQL计数来自100个视图的行,没有union all

我试图计算每个视图在oracle数据库中的行数.

有超过100个视图.

我希望它显示视图名称和行数.

我试过了

SELECT VIEW_NAME, COUNT(*) FROM ALL_VIEWS 
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

我尝试了使用group by的类似查询view_name and max(rownum)但是这也没有用.

我写的SQL正在生成view_names or max(rownum)分配给的计数view_names.我需要每个人的行数view_name.

有一个简单的方法吗?

谢谢,

抢

sql oracle plsql

2
推荐指数
1
解决办法
153
查看次数

Oracle - 子程序或游标c_tab超出范围

create or replace procedure CV8_POCET_RADKU(p_schema VARCHAR2, p_razeni IN varchar2 default 'asc') as
i_dotaz varchar2(200) := 'select count(*) from ';
i_pocet number;  
cursor c_tab is 
  select object_name
  from dba_objects where object_type = 'TABLE' 
  and owner = upper(p_schema) 
  order by object_name asc;

  i_tab c_tab%rowtype;
begin 
dbms_output.put_line('Tabulky ze schematu: ' ||p_schema);
open c_tab;
loop
  fetch c_tab into i_tab;
  exit when c_tab%notfound;
  execute immediate i_dotaz || p_schema||'.'||i_tab.object_name into i_pocet;
  dbms_output.put_line(c_tab.object_name || ' - '|| i_pocet || 'radku');
end loop;
close c_tab;
end;
Run Code Online (Sandbox Code Playgroud)

Oracle给我一个错误子程序或游标c_tab超出范围.我想我的光标正确.

sql database oracle plsql

2
推荐指数
1
解决办法
1万
查看次数

如何在PL/SQL中创建其值仍然存在的变量?

我正在编写一个过程,其中我需要一个变量中的值,我可以更改并保持该变量.

更具体地说,这需要是一个从10001开始的计数器,并且每次调用该过程时都会递增.我不想返回这个值,因为它需要连接到其他几个值,然后将返回(用于另一个表的ID生成).

我研究了在SQL PLUS中使用绑定变量似乎没有帮助.我宁愿不为这个值创建一个表.是否有允许这样的选项?

oracle toad plsql

2
推荐指数
1
解决办法
58
查看次数

Oracle DB:如何将函数结果存储到变量内部程序中

美好的一天.我有一个功能:

create function get_n(search tt.pp%type)
  return number
  is rc number;
begin
  select count(*)
  into rc
  from tt
  where tt.pp=search;

  return (rc);
end;
/
Run Code Online (Sandbox Code Playgroud)

我可以得到结果

variable qwe number;

begin
  select get_n('sample')
    into :qwe
    from dual;
end;

print qwe;
Run Code Online (Sandbox Code Playgroud)

所以,它成功运作.但是部分:我print执行其他时不能执行(PLS-00103:遇到符号"PRINT"......).这真的很奇怪.

我尝试从匿名块中的函数获取结果并打印它:

declare
  qwe number;
begin
  select get_n('sample')
    into :qwe
    from dual;
  dbms_output.put_line(qwe);
exception
  when others
    then dbms_output.put_line(sqlerrm);
end;
/
Run Code Online (Sandbox Code Playgroud)

它不打印任何东西.为什么?

oracle plsql

2
推荐指数
1
解决办法
2605
查看次数

从不存在的表中选择

我有一个关于ORACLE的问题,我编写了一个PLSQL代码来检查一个表是否存在,如果它存在,那么我从这个表中选择一些东西..pseudocode就像:

如果(表存在)从表中选择....

问题是,如果表不存在,我总是会收到错误,即使从不满足if条件并且从不执​​行select语句.

我认为这是因为我的代码在编译时被检查:"select from .."然后如果表不存在则会输出错误.我怎样才能解决这个问题?这里是我的代码的样子(我使用了通用名称):

     DECLARE
          v_table_exists NUMBER;
       BEGIN

          SELECT NVL(MAX(1), 0)
            INTO v_table_exists
            FROM ALL_TABLES
           WHERE TABLE_NAME = 'TABLE_TEST';

          IF v_table_exists = 1 THEN
             INSERT INTO MY_TABLE(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
             SELECT 1234,
                    5678,
                    T.COLUMN_TEST1,
                    T.COLUMN_TEST2


    FROM  TABLE_TEST T
          WHERE T.FLAG = 1;
      END IF;
   END;
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

2
推荐指数
1
解决办法
988
查看次数

如何在Oracle PLSQL中提交单个事务

我需要编写一个PL/SQL过程,在这个过程中我需要在自己的事务边界内调用另一个过程,并且无论主事务的失败或提交如何都要提交它.换句话说,我需要像REQUIRES NEW事务传播这样的东西.

就像是:

procedure mainProcedure(arugements) is 
begin
    // some statements
    nestedProcedure(someArguments);
    // some other statements
end;

procedure nestedProcedure(arguments) is
begin
  // start a new transaction
  // some statements, lock some objects!
  // commit the new transaction and release locked objects
end;
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

oracle plsql transactions

2
推荐指数
2
解决办法
1707
查看次数

使用名称的字符串表示来调用PLSQL存储过程

我有一个按照给定顺序为表中的所有行调用的过程列表.我想将它们全部添加到一个单独的表中,而不是硬编码过程调用,并遍历包含调用每个过程的过程的行.所有过程都需要相同的输入参数.

这是可能吗?

oracle plsql

2
推荐指数
1
解决办法
304
查看次数

在Oracle中的游标声明查询中使用变量

有没有办法在游标声明sql中使用变量?例-

create or replace PROCEDURE PRD (IN_VAR  IN VARCHAR2)
IS

  V_V1 TABLE.DATE_COL%TYPE;

   /* Cursor decleration */
   CURSOR CUR_DUMMY
   IS
        SELECT COL1,COL2,COL3 
          FROM TABLE 
             WHERE DATE_COL BETWEEN V_V1 
                    AND V_V1+1;

BEGIN
   FOR REC  IN CUR_DUMMY
   LOOP

    SELECT TO_DATE(TO_CHAR(sysdate, 'DD-MON-YY') ||' '||(SELECT TO_CHAR(DAY_BEGIN,'HH24:MI:SS') FROM TABLE2),'DD-MON-YY HH24:MI:SS') INTO  V_V1 from DUAL;   

--  other stuffs
    END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

在这里,光标不会获取所需的记录。我可以在游标声明之前的某个位置分配V_V1值吗?虽然我可以在游标sql本身中获取日期,但是会有多余的select查询。有没有更好的办法 ?

oracle plsql cursor

2
推荐指数
1
解决办法
6300
查看次数

标签 统计

oracle ×10

plsql ×10

sql ×4

oracle11g ×2

cursor ×1

database ×1

toad ×1

transactions ×1