像过程和函数中一样,我们可以将参数传递给触发器吗?可以明确调用触发器吗?
我是oracle的新手.我使用pl sql developer在oracle数据库中创建了一个函数,并且我成功执行了.现在我想通过查询从同一个pl sql开发人员运行该函数.但它不能正常工作.以下是我的功能.
create or replace function com.my_first_test_function(module_code out varchar2,
bpm_process_name out varchar2,module_name out varchar2,input in number)return number is
y_return number(1)
N_return varchar(200)
begin
if input='yes' then
Y_return :=select module_code ,bpm_process_name,module_name from com_tm_bpm_process_details;
if input='no' then nested_procedure_exception exception
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用下面的查询运行此函数时,它会抛出一些错误消息.任何人都可以告诉我如何从pl sql developer调用该函数.
select * from com.my_first_test_function(java.sql.Types.VARCHAR,java.sql.Types.VARCHAR,java.sql.Types.VARCHAR,'yes')
Run Code Online (Sandbox Code Playgroud)
这里我尝试没有参数值,但仍然没有用.
在我的存储过程中,我使用以下查询:
SELECT COUNT(*) INTO COL_NO FROM user_tab_columns WHERE table_name='PAY_SLIP_FEB_16';
Run Code Online (Sandbox Code Playgroud)
此查询不会出错(因为它不应该).但这里的表名是固定的,所以我想使用一个提供表名的变量.所以我改变了这样的查询:
EXECUTE IMMEDIATE 'SELECT COUNT(*) INTO COL_NO FROM user_tab_columns WHERE table_name='''||TBL_NAME||'''';
Run Code Online (Sandbox Code Playgroud)
此查询给出错误:
ORA-00905: missing keyword
Run Code Online (Sandbox Code Playgroud)
我做错了什么?TIA.
注意:TBL_NAME是提供表名称的传入参数,COL_NAME只是NUMBER(5,0)类型变量.
CREATE OR REPLACE FUNCTION sumNumbers(p VARCHAR2) RETURN NUMBER IS
...
SELECT sumNumbers('3 + 6 + 13 + 0 + 1') FROM dual;
Run Code Online (Sandbox Code Playgroud)
所以输出应该是: 23
我有一个相当简单的问题:是否可以在包级别进行异常处理?如果是的话,如何实施呢?
我的包中有程序和函数,如果是,NO_DATA_FOUND我想在我的所有程序和函数中做同样的事情.
所以我的问题是:我可以写
WHEN NO_DATA_FOUND THEN
Run Code Online (Sandbox Code Playgroud)
只需一次,并NO_DATA_FOUND在我的所有过程/函数中使用相同的行作为异常,或者我必须在每个过程/函数中编写该异常处理程序.
最近,我们已经从Oracle 10g切换到11g,直到现在我才注意到我的邮件发送功能不起作用,现在我得到一个错误:
ORA-24247: network access denied by access control list (ACL)
Run Code Online (Sandbox Code Playgroud)
因此,我做了一些谷歌搜索,并发现Oracle 11g中的一项新功能现在限制了用户使用某些软件包,包括utl_smtp。因为我正在寻找一种快速的解决方案,所以我没有阅读Oracle文档,而是去寻找更简单的解决方案,并看了本教程:
https://www.pythian.com/blog/setting-up-network-acls-in-oracle-11g-for-dummies/
Run Code Online (Sandbox Code Playgroud)
我稍微弄乱了一点,但是因为我不知道更好,我想我添加了两个单独的配置.xml文件。因此,我的问题的第一部分是-如何删除它?
第二个问题是:
在向用户添加了一些授权之后,我尝试测试它是否有效,但是我很快意识到它没有作用:
SELECT DECODE(
DBMS_NETWORK_ACL_ADMIN.check_privilege('netacl.xml', 'TEST1', 'connect'),
1, 'GRANTED', 0, 'DENIED', NULL) privilege
FROM dual;
Run Code Online (Sandbox Code Playgroud)
返回值:
PRIVILE
-------
DENIED
Run Code Online (Sandbox Code Playgroud)
为什么?(已排序)
问题的第三部分-阅读后被拒绝,我尝试将其修复为:
BEGIN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('netacl.xml' ,'TEST1', TRUE, 'connect');
END;
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:
Ora19279 - XQuery dynamic type mismatch.....(more text meaning nothing to me).
Run Code Online (Sandbox Code Playgroud)
为什么?(我想出了,如果您授予同一用户第二次相同的权限,就会发生错误)
更新
我遵循下面kevinsky的建议答案,并且在此过程中学到了很多东西,但是我仍然有问题。我仍然收到ORA-24247:访问控制列表(ACL)拒绝了网络访问。因为我按照建议执行了所有其他操作,所以我开始认为问题可能是我添加的第一个配置文件,但现在无法删除,因为我不记得它的名称了。如果有人可以帮助我,我将非常感谢。
结果(我正在尝试一些不同的事情):
select * from dba_network_acls;
Run Code Online (Sandbox Code Playgroud)
退货
* | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
myservername.com | 25 | 25 | /sys/acls/utl_smtp.xml| ACLID...
myDBName …Run Code Online (Sandbox Code Playgroud) 我有这是Oracle数据库中的表:
1-用户表
????????????????????
? UserID ? Name ?
????????????????????
? 12345 ? Scott ?
????????????????????
? 54321 ? Jeffry ?
????????????????????
? 98765 ? Larry ?
????????????????????
Run Code Online (Sandbox Code Playgroud)
2- ScoreTypes表
?????????????????????????????????
? ScoreTypeID (PK) ? Title ?
?????????????????????????????????
? 1 ? Football ?
?????????????????????????????????
? 2 ? Volleyball ?
?????????????????????????????????
? 3 ? Basketball ?
?????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
3- UserResults
?????????????????????????????????????????????
? UserID (FK) ? ScoreTypeID (FK) ? ScoreNum ?
?????????????????????????????????????????????
? 12345 ? 1 ? 89 ?
?????????????????????????????????????????????
? 12345 ? 2 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个返回两列结果的查询:VARCHAR(256)和NUMBER.为了存储查询结果以供将来使用,我创建了以下类型:
-- An object representing each of the records of my query
create or replace TYPE TP_SOME_TYPE IS OBJECT(
SOME_TEXT VARCHAR2(256),
SOME_NUMBER NUMBER
);
-- A table of the objects created above:
create or replace TYPE TP_SOME_TABLE AS TABLE OF TP_SOME_TYPE;
Run Code Online (Sandbox Code Playgroud)
最后,我运行一个示例SQL尝试在类型变量中收集结果TP_SOME_TABLE:
DECLARE
SOME_RESULT TP_SOME_TABLE;
BEGIN
EXECUTE IMMEDIATE 'SELECT ''TEXT'' AS SOME_TEXT, 1 AS SOME_NUMBER FROM DUAL'
BULK COLLECT INTO SOME_RESULT;
END;
Run Code Online (Sandbox Code Playgroud)
并收到以下错误消息:
ORA-00932: tipos de dados inconsistentes: esperava - obteve - …Run Code Online (Sandbox Code Playgroud) 鉴于此伪代码
create or replace procedure my_test
( arg1 IN varchar2 )
begin
select var1, var2, var3 from table1
where
var1 in (select var1 from table2)
if(arg1 = 'some_val')
and
var2 < 100
end if;
end;
Run Code Online (Sandbox Code Playgroud)
现在,我知道if在where子句中不允许使用语句,并且case我看到的所有语句示例都只进行变量赋值(而不是执行子句)(例如,此处以及此处和此处).
是否有可能使用a过滤条件依赖于参数函数的where子句case,或者是使用动态SQL的唯一方法?
我想知道我们是否有任何技术可以计算出需要为批量收集操作的LIMIT子句设置的值.例如下面,假设我们的光标有1000万条记录.我们可以为LIMIT子句设置的值是什么,以获得最佳性能.我们有什么方法可以计算它.
decalre
cursor c_emp is <some select query>
var <variable> ;
begin
open c_emp;
loop
fetch c_emp bulk collect into var limit 2;
exit when c_emp%NOTFOUND;
end loop;
close c_emp;
end;
Run Code Online (Sandbox Code Playgroud)