我正在尝试将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) 我是 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) 我突然想到 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)
不过,我担心这并不容易遵循。感谢您的任何见解!
序列生成的主键似乎不适用于 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 是 …
准备好的查询结构和性能之间是否存在差异
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) 我们可以在 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
我是 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 功能
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)
我的功能有什么问题?
在 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 中执行类似的操作?
假设我有一个用于创建销售订单的 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 ×10
plsql ×10
sql ×4
database ×2
concurrency ×1
foreign-keys ×1
inner-join ×1
procedure ×1
sql-function ×1