标签: plsql

我们可以在Oracle的触发器中传递参数吗?

像过程和函数中一样,我们可以将参数传递给触发器吗?可以明确调用触发器吗?

oracle triggers plsql

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

如何在pl sql developer中运行sql函数

我是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)

这里我尝试没有参数值,但仍然没有用.

oracle plsql

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

Oracle Execute Immediate会丢失关键字错误

在我的存储过程中,我使用以下查询:

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)类型变量.

oracle plsql

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

PL/SQL用"+"分割字符串并将其中的数字相加?

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

sql oracle plsql

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

PL/SQL包级别异常处理

我有一个相当简单的问题:是否可以在包级别进行异常处理?如果是的话,如何实施呢?

我的包中有程序和函数,如果是,NO_DATA_FOUND我想在我的所有程序和函数中做同样的事情.

所以我的问题是:我可以写

WHEN NO_DATA_FOUND THEN
Run Code Online (Sandbox Code Playgroud)

只需一次,并NO_DATA_FOUND在我的所有过程/函数中使用相同的行作为异常,或者我必须在每个过程/函数中编写该异常处理程序.

sql oracle plsql

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

Oracle Database 11g中的访问控制列表(ACL)拒绝了网络访问

最近,我们已经从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 plsql oracle11g ora-24247

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

是否可以在SQL或PL/SQL中构建此查询?

我有这是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)

sql oracle plsql oracle11g

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

ORA-00932 - 创建自定义类型表后的数据类型不一致

我正在开发一个返回两列结果的查询: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)

oracle plsql oracle11g

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

可选的where子句依赖于函数参数

鉴于此伪代码

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的唯一方法?

sql oracle select plsql where

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

使用批量收集时设置LIMIT的值

我想知道我们是否有任何技术可以计算出需要为批量收集操作的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)

oracle plsql plsqldeveloper oracle11gr2

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