标签: plsql

PL/SQL Dynamic Where子句 - 围绕动态字符串的单引号?

简单的问题 - 如果我正在尝试构建动态查询并在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.我已经尝试添加它们,但我没有做任何正确的编译.

对简单问题的任何帮助?谢谢!

sql oracle plsql

0
推荐指数
1
解决办法
8501
查看次数

PL SQL表参数

我想将表类型作为参数传递给过程.

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)

但甲骨文说: …

oracle types plsql

0
推荐指数
1
解决办法
8754
查看次数

批量收集...用于所有用途

我想了解用法和批量收集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 plsql bulkinsert

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

Oracle Sequence不生成连续数字

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

序列的任何替代?

oracle plsql sequence oracle11g

0
推荐指数
1
解决办法
4081
查看次数

To_CHAR结果不能进入VARCHAR2

有些奇怪我想要理解

假设我们有这个代码:

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有问题吗?什么问题?有什么办法?

谢谢

oracle plsql

0
推荐指数
1
解决办法
1158
查看次数

获取最后插入的行的ID,并使用它插入存储过程中的另一个表

我有以下存储过程用于将数据插入表中:

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语句之前和之后尝试但是这又给出了另一个错误.

关于如何做到这一点的任何想法?

谢谢

sql plsql oracle10g

0
推荐指数
1
解决办法
1950
查看次数

在Oracle中将Char限制为两个值

我正在PL/SQL中创建一个表,但我希望我的char列只能被允许r或者d.我一直在环顾四周,但没有在网上找到具体的答案.也许我只是没有使用正确的搜索词.

database oracle plsql

0
推荐指数
1
解决办法
58
查看次数

Oracle PL/SQL可以将整数计算为布尔值吗?

特定 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…?

plsql oracle11g

0
推荐指数
1
解决办法
573
查看次数

找不到匹配的记录时返回NULL

我正在将一个员工编号传递给一个函数并返回加入日期.

我希望在找不到匹配的记录时返回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)

oracle plsql function

0
推荐指数
1
解决办法
616
查看次数

PL/SQL字符变量

我表中的所有项目都是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)

有没有人有想法?

sql oracle plsql

0
推荐指数
1
解决办法
133
查看次数

标签 统计

plsql ×10

oracle ×8

sql ×3

oracle11g ×2

bulkinsert ×1

database ×1

function ×1

oracle10g ×1

sequence ×1

types ×1