最好用一个例子来解释.给出以下数据库对象:
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函数返回一个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) 我试图计算每个视图在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.
有一个简单的方法吗?
谢谢,
抢
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超出范围.我想我的光标正确.
我正在编写一个过程,其中我需要一个变量中的值,我可以更改并保持该变量.
更具体地说,这需要是一个从10001开始的计数器,并且每次调用该过程时都会递增.我不想返回这个值,因为它需要连接到其他几个值,然后将返回(用于另一个表的ID生成).
我研究了在SQL PLUS中使用绑定变量似乎没有帮助.我宁愿不为这个值创建一个表.是否有允许这样的选项?美好的一天.我有一个功能:
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代码来检查一个表是否存在,如果它存在,那么我从这个表中选择一些东西..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) 我需要编写一个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)
我怎样才能做到这一点?
我有一个按照给定顺序为表中的所有行调用的过程列表.我想将它们全部添加到一个单独的表中,而不是硬编码过程调用,并遍历包含调用每个过程的过程的行.所有过程都需要相同的输入参数.
这是可能吗?
有没有办法在游标声明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查询。有没有更好的办法 ?