标签: plsql

如何解决 Oracle DBMS_LOB 问题

我正在尝试将XML文件的信息保存在数据库表中,我正在使用以下过程:

create or replace PROCEDURE P_FILEUPLOAD_XML (P_CMTT_CODE IN NUMBER DEFAULT 15, P_TEXT IN VARCHAR2, P_TEXT_NAR IN VARCHAR2, P_PATH IN VARCHAR2, P_FILENAME IN VARCHAR2, P_RET_VAL OUT NUMBER) IS

GRUPO       VARCHAR2(20);
l_dir       CONSTANT VARCHAR2(35) := P_PATH;
l_fil       CONSTANT VARCHAR2(30) := P_FILENAME; 
l_loc       BFILE; -- Pointer to the BFILE
l_ret       BOOLEAN := FALSE; -- Return value
l_pos       NUMBER := 1; -- Current position in the file (file begins at position 1)
l_sum       number default 8000; -- Amount of characters have been …
Run Code Online (Sandbox Code Playgroud)

oracle plsql procedure

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

PL/SQL RAISE_APPLICATION_ERROR 参数问题

我是 PL/SQL 的新手,我不完全理解 RAISE_APPLICATION_ERROR 的错误代码参数。

在文档中它说The error_number is a negative integer with the range from -20999 to -20000。但这并不能解释我是否可以选择随机数或是否有系统。另外我想知道在调用 RAISE_APPLICATION_ERROR 时是否可以在不同的函数中重用相同的数字?还是会在某个地方使用该数字来识别该特定错误?

我也在看别人写的程序,想知道他们为什么不直接传递SQLCODE给 RAISE_APPLICATION_ERROR 而不是像这样取随机数RAISE_APPLICATION_ERROR(l_err_code, 'Record already exists!');

我的印象是,用户定义的错误只使用整数 -20999 到 -20000,而不是现有的错误。

PROCEDURE insert_record
(v_row IN OUT TABLE1%ROWTYPE) IS

 l_err_code NUMBER;
 l_err_message VARCHAR(200);
 BEGIN 


    INSERT INTO TABLE1 ....
      RETURNING id INTO V_row.id;

 EXCEPTION      
    WHEN DUP_VAL_ON_INDEX THEN
       l_err_code := SQLCODE;  
       l_err_message  := 'Insert Error: ' - ' || SQLERRM;   

       ...logging error here

      RAISE_APPLICATION_ERROR(-20001, 'Record already exists!');    
  WHEN OTHERS …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

设置除以 0 返回 0

我突然想到 PL/SQL 可能有一种更简洁的方法来做到这一点:

我有一个程序可以被零除,但在所有情况下我都希望它返回 0。我当前的逻辑如下所示:

if bar <> 0 then
    foobar := foo/bar;
else
    foobar := 0;
end if;
Run Code Online (Sandbox Code Playgroud)

有谁知道更简单/更便宜的方法来做到这一点?我对 PL/SQL 还很陌生,我看到我可以使用异常处理程序,但这似乎跳过了操作。所以我想我可以破例zero_divide然后做:

foobar := 0;
foobar := foo/bar;
Run Code Online (Sandbox Code Playgroud)

不过,我担心这并不容易遵循。感谢您的任何见解!

oracle plsql divide-by-zero

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

序列生成的主键似乎不适用于 select 语句

序列生成的主键似乎不适用于 select 语句

我正在尝试创建一个传输数据库。我已经在 Access 和 MySQL 中完成了。现在我在 Oracle 中使用它,而且我对使用它完全陌生。我遇到了序列生成字段的麻烦。或者至少我是这么认为的。当您阅读整篇文章时,您将上手。

这是我的 driverRecords 表的代码:

CREATE TABLE TRANSPORT_SCHEMA.driverRecords
(
    driverReg varchar2(15) PRIMARY KEY,
    driverIDNumber varchar2(10) UNIQUE,
    surname varchar2(15) NOT NULL,
    otherNames varchar2(30) NOT NULL,
    address varchar2(20),
    email varchar2(320) NOT NULL,
    DOB date NOT NULL,
    employmentDate date NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

这是驱动许可证表的代码:

CREATE TABLE TRANSPORT_SCHEMA.drivingLicences
(
    licenceID varchar2(6) PRIMARY KEY,
    vehicleClass varchar2(15),
    issueDate date,
    expiryDate date,
    driverReg varchar2(15) UNIQUE,
    CONSTRAINT fk_driverReg FOREIGN KEY(driverReg) REFERENCES driverRecords(driverReg),
    CONSTRAINT Chk_vehicleClass CHECK(vehicleClass IN('A','B','C','D','E','F','G'))
);
Run Code Online (Sandbox Code Playgroud)

所以我试图将记录插入到驾驶执照中。driveLicences 中的 driverReg 是 …

sql database oracle plsql foreign-keys

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

SQL join-on中约束放置的性能差异

准备好的查询结构和性能之间是否存在差异

select * 
from employee e
join division d
    on e.eid = d.eid
    and e.div = d.div
    and e.level > 5
    and e.startDate > sysdate - interval '60' month
;
Run Code Online (Sandbox Code Playgroud)

和:

select * 
from employee e
join division d
    on e.eid = d.eid
    and e.div = d.div
where 
    e.level > 5
    and e.startDate > sysdate - interval '60' month
;
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql inner-join query-performance

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

Oracle PL/SQL 条件声明?

我们可以在 pl/sql 函数或过程中对变量进行条件声明吗?例如,我们可以执行以下操作:

CREATE OR REPLACE FUNCTION get_total_sales(
    in_year PLS_INTEGER
) 
RETURN NUMBER
IS
    IF condtion THEN
       variable_name_1 BINARY_FLOAT;
    ELSE
       variable_name_2 NUMBER;
    END;

BEGIN
   --- Function Logic
END;
Run Code Online (Sandbox Code Playgroud)

如果condition满足,我需要声明一个名为的变量variable_name_1,如果不是,我不想声明它,而是需要声明一个名为variable_name_2.

database oracle plsql stored-procedures conditional-compilation

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

PL/SQL:如何将表名传递给动态 SQL?

我是 PL/SQL 的新手,我尝试SELECT通过参数动态设置表名。

这工作正常。

DECLARE 
  FUNCTION foo (pat VARCHAR) RETURN NUMBER IS
    tabname VARCHAR (100) := 'my_table';
    n NUMBER := -1;
    sqlcmd VARCHAR (100) := 'SELECT COUNT(*) FROM ' || tabname || ' WHERE bezeichnung LIKE :1';
  BEGIN
    EXECUTE IMMEDIATE sqlcmd INTO n USING pat;
    RETURN n;
  END foo;
BEGIN
    dbms_output.put_line (foo ('bla%'));
END;
Run Code Online (Sandbox Code Playgroud)

如果我尝试tabname按原样设置参数,pat则它会失败并显示错误:

无效的表名

DECLARE

  FUNCTION defval (pat VARCHAR, offs NUMBER) RETURN NUMBER IS
    tabname VARCHAR (100) := 'A_KGL_EIGENSCHAFTEN';
    n NUMBER := …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

Oracle 函数编译成功但在执行 PLS-00221 时抛出错误:不是过程或未定义

我有简单的 oracle 功能

create or replace function abs.test_func(test_in in number)
return number
is
   test_out number ;
BEGIN
test_out:=test_in;
RETURN test_out;
END;
Run Code Online (Sandbox Code Playgroud)

如果我编译它 - 它编译成功。但是当我从 PLSQL Developer SQL Window 运行时

 BEGIN abs.test_func(5); END;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

ORA-06550: line1, column8;
PLS-00221: 'TEST_FUNC' is not a procedure or is undefined
ORA-06550: line1, column8;
PL/SQL: Statement ignored
Run Code Online (Sandbox Code Playgroud)

我的功能有什么问题?

sql oracle plsql stored-procedures sql-function

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

PL/SQL 等效于 T-SQL 面向集合的变量连接

在 Microsoft SQL Server (T-SQL) 中,有一种简洁、优雅且高性能的面向集合的方法可以使用表中多行值的串联来填充 VARCHAR 变量,即:

DECLARE @vals NVARCHAR(MAX)
SELECT @vals = ISNULL(@vals + ',', '')
+ <some_varchar_column>
FROM <some_table>
Run Code Online (Sandbox Code Playgroud)

@vals用逗号分隔的字符串填充some_column所有行中的所有值some_table(例如,“value1,value2,value3,...”)。

我如何以同样优雅的方式(无需编写循环/游标)在 Oracle PL/SQL 中执行类似的操作?

sql oracle plsql string-aggregation

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

2 个用户同时运行一个存储过程 - 如果一次执行中的 DML 语句影响并行执行中的测试/条件,会发生什么?

假设我有一个用于创建销售订单的 PL/SQL 存储过程,如下所示:

CREATE OR REPLACE PROCEDURE save_order 
(
  o_output_status               OUT BINARY_INTEGER,
  i_customer                    IN  VARCHAR2,
  i_product_code                IN  VARCHAR2,
  i_quantity                    IN  BINARY_INTEGER
)
IS

  l_stock_available               BINARY_INTEGER;

BEGIN

  o_output_status := -1;

  SELECT available
    INTO l_stock_available
    FROM stock
   WHERE product = i_product_code
  ;

  IF l_stock_available >= i_quantity THEN

    INSERT INTO sales_orders (order_number, customer, product, quantity)
         VALUES (order_seq.nextval, i_customer, i_product_code, i_quantity)
    ;

    -- hello

    UPDATE stock
       SET available = available - i_quantity
     WHERE product = i_product_code
    ;

    o_output_status := 0;

  END IF;

END save_order; …
Run Code Online (Sandbox Code Playgroud)

oracle concurrency plsql

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