标签: plsql

有没有办法比较PL/SQL中一列中的多行?

我已经使用SQL超过25年,但我对Oracle相对较新.我以前的经验是在DB2和SQL Server中.

我被要求编写一个脚本,通过以下布局查看表:

OrderNo int
ClientID varchar(20)
Order_Date datetime
ProductCode varchar(5)
CreditLimit money
AccountNo varchar(25)

用户在每个订单上输入客户的CreditAccountNo.(我知道它应该从一个表中提取,但它是一个自行开发的应用程序,并且他们没有这样写.有一天,我会让他们让我解决这个问题.)

问题是,虽然有些客户确实有多个信用账户,但大多数只有一个.但是用户经常错误地输入错误的帐号.他们希望我编写一个查看每个clientid的脚本,并显示表中有多个帐号的客户端.

通常,我会有这样的东西(伪代码):

ClientID Cursor
    Read distinct ClientID
    Order Cursor
        Read Order Record for ClientID
        If first iteration, set variable X = AccountNo
        If AccountNo <> X print ClientID, X, AccountNo
        Read next row
    Loop
    Read next row
Loop
Run Code Online (Sandbox Code Playgroud)

我想知道是否没有PL/SQL命令让我废除第二个循环.

希望这个问题有道理.

oracle plsql

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

ORACLE PL-SQL如何使用函数SPLIT字符串并返回列表

如何拆分给定分隔符的给定字符串.

例如:

INPUT

String =>'1,2,3,4,5'Delimiter =>','

OUTPUT

1 2 3 4 5

string plsql split function tokenize

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

触发Sql Oracle

create or replace trigger t1 
  before update of price on book 
declare 
  vdif number; 
begin 
  vdif:=:new.price-:old.price; 
  dbms_output.put_line('Price Diff is '||vdif); 
end;
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

表级触发器中不允许使用新引用或旧引用

sql oracle triggers plsql

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

foreach我的表行并更新我的ROW_NUMBER列

我想创建一个脚本pl/sql,我可以在其中修改我的列ROW_NUMBER的值(第一次ROW_NUMBER的值等于NULL).

这是我的表'A'的结构:

CREATE TABLE A
   (
    "NAME" VARCHAR2(25 BYTE), 
    "NUM" NUMBER(10,0)
   )
Run Code Online (Sandbox Code Playgroud)

如果Column'NAME'等于'DEB',我想预先处理表A的所有行并将我的列'NUM'递增1.

我想得到如下结果:

在此输入图像描述

我创建了一个pl/sql脚本:

DECLARE
 INcrmt NUMBER(4):=1;
 line WORK_ODI.TEST_SEQ%ROWTYPE;--before fetch it returns 0
 CURSOR c_select IS
 SELECT ROW_NUMBER,VALUE FROM WORK_ODI.TEST_SEQ;
BEGIN
 OPEN c_select;
  LOOP
   FETCH c_select INTO line;
   DBMS_OUTPUT.PUT_LINE(line.VALUE);
   if line.VALUE like '%DEB%'
   then
    UPDATE WORK_ODI.TEST_SEQ SET ROW_NUMBER = INcrmt WHERE VALUE=line.VALUE;
    INcrmt := INcrmt + 1;
   end if;
   if line.VALUE not like '%DEB%'
    then
    UPDATE WORK_ODI.TEST_SEQ SET ROW_NUMBER = INcrmt WHERE VALUE=line.VALUE;
   end if;
   EXIT WHEN c_select%NOTFOUND;
  END …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql sql-update

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

PL/SQL存储过程

请帮我解释一下这个存储过程的语法?这是在oracle的SQL开发人员中完成的.

存储过程的目的是允许CALL函数将新记录插入CLASS表(使用下面的语法创建):

CREATE TABLE class
(
class_number NUMBER(8), 
teacher_name VARCHAR2(50),
class_name VARCHAR2(50) NOT NULL,
start_date DATE,
end_date DATE,
class_category VARCHAR2(20),
topic VARCHAR2(20),
teacher_credential VARCHAR2(40),
CONSTRAINT pk_class PRIMARY KEY (class_number,teacher_name,class_name,start_date)
);
Run Code Online (Sandbox Code Playgroud)

使用下面编码的存储过程和序列,应该创建一个新类,如果结束日期在开始日期之前,那么结束日期应该是默认的开始日期+两周.

CREATE SEQUENCE class_number_seq;

 CREATE OR REPLACE PROCEDURE insert_class
(
  Teacher_name_param class.teacher_name%TYPE,
  class_name_param class.class_name%type,
  start_date_param class.start_date%TYPE ,
  end_date_param class.end_date%TYPE,
  class_category_param class.class_category%TYPE,
  topic_param class.topic%TYPE,
  end_date_param class.end_date%TYPE
  )
  AS 
      class_number_var class.class_number%TYPE;
      end_date_var class.end_number%TYPE;


BEGIN
   SELECT class_number_seq.NEXTVAL INTO class_number_var FROM dual;

   IF end_date_param < start_date_param OR end_date_param IS NULL THEN
     end_date_param := start_date_param …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql stored-procedures

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

Plsql分割字符串的最佳方法

从字符串中提取单词的最佳方法是什么?我已经做了一些事情,因为我找到了许多方法,但没有一个看起来"简单".

我们假设有一个名为'change_opening_hours'的程序.此过程具有名为"v_perioden"的时间范围字符串输入.

这个字符串看起来像:

'10:00-12:00' 或

'10:00-12:00 14:00-16:00' 或

'10:00-12:00 14:00-16:00 18:00-22:00' 等

现在我已经自己做了一些事情来从这个输入中抽出每一段时间.

  v_perioden   VARCHAR2(50) := '10:00-12:00 14:00-18:00 22:00-24:00';
  ...
  -- loop though time-periode depeningd
  -- on amount of spaces
  FOR i IN 0..REGEXP_COUNT(v_perioden, ' ') LOOP
    -- first period
    IF i = 0 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 0, 11));
    -- second period
    ELSIF i = 1 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 13, 11));
    --thirt period
    ELSIF i = 2 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 25, 11));
    END IF;
  END LOOP;
Run Code Online (Sandbox Code Playgroud)

输出:

10:00-12:00
14:00-18:00
22:00-24:00
Run Code Online (Sandbox Code Playgroud)

现在这种方式工作正常,但它不是那么有能力.我试图找出如何从空间中的字符串中提取单词,但这并没有成功.

sql oracle plsql

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

如何使用`execute immediate`为变量赋值?

我试图execute immediate用作分配变量值的特殊要求.我使用以下代码并获得如下异常.

declare
  lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
  l_str varchar2(400);

  a number(10);
begin
  select *
    into lv_kyc_main_GBL
    from KYC_GBL_MAIN.KYC_MAIN
   where rownum = 1;

  -- l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';

  l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
  dbms_output.put_line(l_str);

  execute immediate (l_str);
end;
/
Run Code Online (Sandbox Code Playgroud)

我得到的例外是:

anonymous block completed
lv_kyc_main_GBL.legal_name := 'TEST'
Run Code Online (Sandbox Code Playgroud)

在命令的第4行开始出错:

declare
  lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
  l_str varchar2(400);

  a number(10);
begin
  select *
    into lv_kyc_main_GBL
    from KYC_GBL_MAIN.KYC_MAIN
   where rownum = 1;

  --l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';

  l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
  dbms_output.put_line(l_str);

  execute immediate (l_str);
end;
/

Error report:
ORA-00900: invalid SQL statement
ORA-06512: …
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic-sql execute-immediate

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

如何删除在日期之前创建的用户名下的所有表?

我需要删除在2010年1月1日之前创建的所有表.我在stackoverflow中遇到了一些示例,但没有一个符合我的需要.与主键没有冲突,这是一个好点.它必须在pl/sql中,但sql是可以的,我可以搞清楚.

sql oracle plsql

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

如何使用DDL语句跟踪PL/SQL块

如何使用DDL语句跟踪PL/SQL块?

我正在尝试做这样的事情:

DECLARE TRESULT INTEGER;

BEGIN

  SELECT COUNT(1) INTO TRESULT
    FROM USER_INDEXES
    WHERE INDEX_NAME='IX_SalesmanID';

  IF TRESULT > 0 THEN
    EXECUTE IMMEDIATE 'DROP INDEX IX_SalesmanID';
  END IF;

END;

CREATE INDEX IX_SalesmanID ON Salesmen(SalesmanID);
Run Code Online (Sandbox Code Playgroud)

但是我收到一条错误消息:

Error report:
ORA-06550: line 15, column 1:
PLS-00103: Encountered the symbol "CREATE" 
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
Run Code Online (Sandbox Code Playgroud)

不过,我应该在街区之外,对吗?

这是一个非常简化的版本,实际的脚本将检查是否存在许多内容,并删除,重新创建并重复更改许多对象及其许多属性.将它们全部放在动态SQL字符串中并使用EXECUTE IMMEDIATE似乎有点矫枉过正.

在上面的示例中尝试关闭块时,我做了一些简单的错误吗?

谢谢你的帮助.

oracle plsql

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

PL / SQL:ORA-00932:数据类型不一致:预期的UDT得到了NUMBER

我正在执行PL / SQL代码以显示“失败预留”表中的“货币代码”。使用对象类型和嵌套表集合。
运行PL / SQL代码时,将产生以下错误。相应的行在PL / SQL代码部分中突出显示。

错误报告:

ORA-06550: line 27, column 11:
PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got NUMBER
ORA-06550: line 27, column 4:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
Run Code Online (Sandbox Code Playgroud)


该代码粘贴在下面:

DDL-表创建:

CREATE TABLE FAILEDRESERVATION
(   
    FAILEDRESERVATIONID NUMBER(18,0), 
    FK_TRANSACTIONID NUMBER(18,0), 
    DEBITRESERVATIONID NUMBER(18,0), 
    RESERVATIONTIME DATE, 
    RESERVATIONAMOUNT NUMBER(18,5), 
    CURRENCYCODE CHAR(3 BYTE), 
    AVAILABLEAMOUNT NUMBER(18,5)
);

ALTER TABLE FAILEDRESERVATION 
ADD CONSTRAINT "PK_FAILEDRESERVATION" PRIMARY KEY ("FAILEDRESERVATIONID");
Run Code Online (Sandbox Code Playgroud)


对象类型:

CREATE OR REPLACE …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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