标签: plsql

在程序中使用FOR UPDATE时应该何时提交?

如果我在存储过程中使用FOR UPDATE子句应该何时"提交"?关闭打开的光标后或关闭打开的光标之前?以下是我正在使用的程序,我是以正确的方式做的吗?

CREATE OR REPLACE PROCEDURE Proc_UpdateCSClientCount(inMerid     IN  VARCHAR2,
                                                     outCliCount  OUT NUMBER,
                                                     outretvalue  OUT NUMBER)
AS
   CURSOR c1 IS
      SELECT CLIENT_COUNT
        FROM OP_TMER_CONF_PARENT
       WHERE MER_ID = inMerid
      FOR UPDATE OF CLIENT_COUNT;
BEGIN
   OPEN c1;
   IF SQL%ROWCOUNT = 1 THEN
      FETCH c1 INTO outCliCount;
      outCliCount := outCliCount + 1;
      UPDATE OP_TMER_CONF_PARENT
         SET CLIENT_COUNT = outCliCount
       WHERE CURRENT OF c1;
   END IF;
   outretvalue := 0;
   CLOSE c1;
   COMMIT;
EXCEPTION
   WHEN no_data_found THEN
      outretvalue := -1;
END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures oracle10g oracle11g

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

是否有更好的Oracle运算符进行空安全等式检查?

根据这个问题,在Oracle中执行相等性检查的方法,我想将null视为等于null就像是

SELECT  COUNT(1)
  FROM    TableA
WHERE 
  wrap_up_cd = val
  AND ((brn_brand_id = filter) OR (brn_brand_id IS NULL AND filter IS NULL))
Run Code Online (Sandbox Code Playgroud)

这实际上可以使我的代码变脏,特别是如果我有很多这样的地方,并且where应用于多个列.有更好的选择吗?

sql oracle plsql

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

将字符串分配给原始变量时,Oracle PL/SQL:ORA-06502错误

我尝试将一些文本信息加载到clob字段中.我减少了代码,我遇到了以下代码:

DECLARE
    WS_MAIN_CHUNK RAW(12001);
BEGIN
    WS_MAIN_CHUNK := 'Do';
END;
/
Run Code Online (Sandbox Code Playgroud)

它给出了错误ORA-06512 PL/SQL:数字或值错误:十六进制到原始转换错误.为什么字符串'Do'是十六进制值,如何修复它?>只需将字符串赋值给原始变量?

谢谢你的帮助

oracle plsql

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

PLSQL过程在运行时获取用户输入

我正在做大学作业,要求我创建一个PLSQL程序,用户可以在其中添加包含多个项目和每个项目数量的新客户订单.我想出了以下内容,要求用户输入一些要添加到订单中的项目,然后使用循环来询问特定的详细信息,例如产品编号和数量.我在运行时遇到用户输入问题...在编译代码时,它会询问产品代码和数量,并且不会在运行时再次询问它而是保存先前在编译时给出的值...

CREATE OR REPLACE 
PROCEDURE Add_Order (Item_amount IN NUMBER, CustNo IN NUMBER) AS

    ItemNo NUMBER; 
    var_Quantity NUMBER;
    var_PONo  NUMBER;  

    BEGIN  

      IF Item_amount BETWEEN 2 AND 9 THEN

        SELECT seq_PONo.NEXTVAL INTO var_PONo from dual;

    INSERT INTO PurchaseOrder_tab
         SELECT  var_PONo, REF(C),
                 SYSDATE,
                 ItemList_tab()
          FROM   Customer_tab C
          WHERE  C.CustNo = CustNo;

    FOR i IN 1..Item_amount LOOP
        DBMS_OUTPUT.PUT_LINE('INSIDE LOOP');
        ItemNo := &Enter_ProdCode;
        var_Quantity := &Quantity_Amount;

        INSERT INTO TABLE (
        SELECT  P.ItemList
          FROM  PurchaseOrder_tab P
         WHERE  P.PONo = var_PONo
        )

        SELECT   seq_ItemNo.nextval, REF(Pr), var_Quantity
          FROM …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

从周数获得第一周的第一天

在Oracle中,有一个直接的方法来获得一周的第一天给出一周的数字吗?

例如,今天的日期是12/4/2012.如果我运行:从双重选择to_char(sysdate,'WW'); 它返回49作为周数.

我想做的是第一天以某种方式返回2012年12月2日...给出第49周(假设星期日是一周的第一天).

有任何想法吗?在此先感谢您的帮助!

oracle plsql

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

立即执行dbms_output.put_line

我有这样的代码:

set serveroutput on

declare
v_str varchar2(200);
begin
v_str := q'!dbms_output.put_line('Hello world');!';
Execute immediate v_str;
end;
Run Code Online (Sandbox Code Playgroud)

Oracle SQL Developer说存在无效的SQL语句,这是什么问题?

sql oracle plsql oracle-sqldeveloper

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

当我们使用SELECT语句时,SQL查询可以用特定值(我们动态定义)替换布尔值吗?

我只是有一个奇怪的问题.我知道这可能很有趣,但我对这个有好奇心.这是我的问题:

假设数据库中有一个名为"gender"的列具有布尔值,即0或1. 0 =男性,1 =女性.现在,当我们显示具有此类型字段的表单的数据时,我们必须执行代码(gender=0)?Male:Female.

现在我只想知道sql是否提供了任何方式,在生成记录集时自动将所有性别值自动替换为男性或女性.即不需要这一行代码?

sql oracle plsql

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

Oracle - 计算CASE语句的结果

目标/背景

  • 我正在梳理一个工作订单系统,看看工人是否符合某些标准
    • (例如,如果他们不是第3阶段,第2阶段,甚至第1阶段).
  • 这些"阶段"已由管理层定义.
  • 我想按照报告的年份,然后是工艺分组,然后看看在这3个"非阶段"的每一个中,该分组有多少工单.

查询

select yearreported
, theleadcraft
, count(NotStage3)
, count(NotStage2)
, count(NotStage1)

from
(
    select extract(year from reportdate) as YearReported
    , Nvl(leadcraft, 'NONE') as TheLeadCraft
    , CASE when status not in ('CAN', 'CLOSE') then 1 else 0 END as NotStage3
    , CASE when status not in ('CAN', 'CLOSE', 'COMP') then 1 else 0 END as NotStage2
    , CASE when status not in ('CAN', 'CLOSE', 'COMP', 'WORKDONE') then 1 else 0  END as NotStage1
    from workorder
) …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql case count

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

无法从PL/SQL中的过程中检索错误

我开始使用PL/SQL并学习如何编写procedures,exceptions但我似乎无法掌握如何显示错误.这个过程很简单,它只能做简单的数学运算,如下所示:

create or replace
procedure get_simple_math
  (n_num1 in number,
   n_num2 in number,
   n_answer out number,
   n_err_code out number,
   n_err_msg out varchar2)
as
begin
  n_answer := (n_num1 / n_num2);
  dbms_output.put_line('Answer is '||n_answer);

  n_err_code := 0;
exception
  when others
  then
    n_err_code := SQLCODE;
    n_err_msg := 'Error in get_simple_math '||SQLERRM;
    raise_application_error (-20002,n_err_msg);
end get_simple_math;
Run Code Online (Sandbox Code Playgroud)

正如你可以看到它没什么特别的,但我不能让我的生活得到block运行:

set serveroutput on
declare
  n_answer number := 0;
  n_err_code number;
  n_err_msg varchar2;
begin
  get_simple_math(10,5,n_answer);
end;
Run Code Online (Sandbox Code Playgroud)

我假设我需要声明设置的变量out,这就是为什么它们在那里.我也尝试将它们添加到procedure执行中:

get_simple_math(10,5,n_answer,n_err_code,n_err_msg);
Run Code Online (Sandbox Code Playgroud)

但这似乎没有诀窍,所以我只是在寻找解决这个问题的一些帮助.提前致谢.

plsql exception procedure

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

如何从plsql存储过程返回集合类型

我在PL/SQL中有以下存储过程:

CREATE OR REPLACE PROCEDURE sample_procedure AS 
DECLARE 
    TYPE list_of_names_t 
      IS TABLE OF emp.emp_index%TYPE; 
    ignoreIndexes LIST_OF_NAMES_T := List_of_names_t();
BEGIN
-- Logic here which fills the values in the collection ignoreIndexes   
END;
Run Code Online (Sandbox Code Playgroud)

从外部调用此存储过程时,如下所示:

    SET SERVEROUTPUT ON
    EXEC sample_procedure
    -- Line YY
Run Code Online (Sandbox Code Playgroud)

@Eline YY,我想从emp表中检索记录,其中索引不在ignoreindexes存储过程中准备的集合中.

1)如何将ignoreindexes在存储过程中创建的嵌套表返回给外部世界,以便我可以使用该表中的索引

提前致谢

oracle plsql

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