简单的问题 - 如果我正在尝试构建动态查询并在PL/SQL存储过程中运行它,如何将变量括在单引号中以便正确调用它?
例如:
我首先声明一个变量来保存游标的列值.我还声明了一个变量来保存动态查询:
vTest VARCHAR(200);
l_cur_string VARCHAR2(128);
Run Code Online (Sandbox Code Playgroud)
定义我的光标后,我像这样循环:
For entry in c1
LOOP
vTest:= entry.variable;
l_cur_string := 'SELECT ex1, ex2FROM exTable WHERE col1= || vTest;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
当然,当我打印出动态查询时,它没有单引号vTest.我已经尝试添加它们,但我没有做任何正确的编译.
对简单问题的任何帮助?谢谢!
我想将表类型作为参数传递给过程.
create or replace package FOO is
type FOOTYPE is record (
FOOTYPE_A varchar2(5) null,
FOOTYPE_B varchar2(5) null,
FOOTYPE_C varchar2(5) null
);
type FOOTYPETABLE is table of FOOTYPE;
...
procedure sendNew (
table_a in FOOTYPETABLE
) is
a number;
begin
...
end sendNew;
...
end FOO;
declare
type bartabletype is table of FOO.FOOTYPE index by binary_integer;
bartable bartabletype;
begin
bartable(0).FOOTYPE_A := '';
bartable(0).FOOTYPE_B := '';
bartable(0).FOOTYPE_C := '';
bartable(1).FOOTYPE_A := '';
bartable(1).FOOTYPE_B := '';
bartable(1).FOOTYPE_C := '';
FOO.sendNew(bartable);
end;
Run Code Online (Sandbox Code Playgroud)
但甲骨文说: …
我想了解用法和批量收集forall语句的需求。
这里提到的一个例子
在大多数示例中,在不同的网页中;作者首先使用批量收集语句从表中获取数据。之后,他们使用forall语句将其插入目标表。
DECLARE
TYPE prod_tab IS TABLE OF products%ROWTYPE;
products_tab prod_tab := prod_tab();
BEGIN
-- Populate a collection - 100000 rows
SELECT * BULK COLLECT INTO products_tab FROM source_products;
FORALL i in products_tab.first .. products_tab.last
INSERT INTO target_products VALUES products_tab(i);
Run Code Online (Sandbox Code Playgroud)
但是我不知道何时选择这种方法。我想我可以编写如下代码:
INSERT INTO target_products
SELECT * FROM SOURCE_PRODUCTS;
Run Code Online (Sandbox Code Playgroud)
而且我认为,插入select语句可以提高性能。
那么,为什么我们需要选择批量收集forall语句?对于错误记录还是其他优势?
我在oracle中有一个序列,它将用作SYSID.序列不是以有序的方式生成,意味着它正在跳过数字,然后它继续.
以下是我的序列
CREATE SEQUENCE leaveform_seq
MINVALUE 1 MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 1560
CACHE 20 ORDER NOCYCLE;
Run Code Online (Sandbox Code Playgroud)
序列的任何替代?
有些奇怪我想要理解
假设我们有这个代码:
DECLARE
a varchar2(6);
BEGIN
a := '000001';
END;
Run Code Online (Sandbox Code Playgroud)
这很好用.没问题
现在我们有了这个:
DECLARE
a varchar2(6);
BEGIN
a := TO_CHAR(1, '000000');
END;
Run Code Online (Sandbox Code Playgroud)
这是行不通的:
ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小
为什么?
nls_language有问题吗?什么问题?有什么办法?
谢谢
我有以下存储过程用于将数据插入表中:
CREATE OR REPLACE PROCEDURE mySproc
(
invoiceId IN NUMBER
customerId IN NUMBER
)
IS
BEGIN
INSERT INTO myTable (INVOICE_ID)
VALUES (invoiceId);
END mySproc;
/
Run Code Online (Sandbox Code Playgroud)
我想要做的是获取最后插入的ID(这是myTable上的主键字段并使用序列自动递增)并将其插入另一个表中,我尝试了以下但无法使其工作:
CREATE OR REPLACE PROCEDURE mySproc
(
invoiceId IN NUMBER
customerId IN NUMBER
)
IS
BEGIN
INSERT INTO myTable (INVOICE_ID)
VALUES (invoiceId)
returning id into v_id;
INSERT INTO anotherTable (ID, customerID)
VALUES (v_id, customerId);
END mySproc;
/
Run Code Online (Sandbox Code Playgroud)
我收到此错误:[错误] PLS-00049(59:26):PLS-00049:错误的绑定变量'V_ID'我想我需要在某处声明v_id但我在BEGIN语句之前和之后尝试但是这又给出了另一个错误.
关于如何做到这一点的任何想法?
谢谢
我正在PL/SQL中创建一个表,但我希望我的char列只能被允许r或者d.我一直在环顾四周,但没有在网上找到具体的答案.也许我只是没有使用正确的搜索词.
特定 v_ssn_ind INTEGER := IF TRIM(p_ssn) IS NULL THEN 0 ELSE 1 END IF;
我知道我可以这样做: IF v_ssn_ind=1 THEN…
但我可以进行短路评估,即:IF v_ssn_ind THEN…?
我正在将一个员工编号传递给一个函数并返回加入日期.
我希望在找不到匹配的记录时返回NULL; 在我的情况下,它只是返回空白或空行;
get_join_date(in_emp_no)
CREATE OR REPLACE FUNCTION get_join_date(in_emp_no) RETURN DATE IS
v_join_date DATE;
BEGIN
SELECT joined_date
INTO v_date
FROM employee
WHERE employee_number = in_emp_no
AND type = in_type;
IF v_join_date IS NOT NULL THEN
v_join_date := v_date;
ELSE
v_join_date = NULL;
END IF;
RETURN v_join_date;
END;
Run Code Online (Sandbox Code Playgroud) 我表中的所有项目都是7位数.如果我输入6位数的东西,应该在开头显示0.(输出应为7位数.)
例如:
输入= 123456输出= 0123456
如何在Oracle SQL中编写它?
我试过了.但它不起作用.
cursor c1 is
into art_no_tmp1
select art_no
from barticles b
where b.ean_no_1 = '789546584587';
cursor checklength is
into len_number
select length(art_no_tmp1)
from dual;
if(len_number = 6) then
return '0'+art_no_tmp1;
else
return art_no_tmp1;
end if;
Run Code Online (Sandbox Code Playgroud)
有没有人有想法?