我已经使用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命令让我废除第二个循环.
希望这个问题有道理.
如何拆分给定分隔符的给定字符串.
例如:
String =>'1,2,3,4,5'Delimiter =>','
1 2 3 4 5
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)
我收到这个错误:
表级触发器中不允许使用新引用或旧引用
我想创建一个脚本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) 请帮我解释一下这个存储过程的语法?这是在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) 从字符串中提取单词的最佳方法是什么?我已经做了一些事情,因为我找到了许多方法,但没有一个看起来"简单".
我们假设有一个名为'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)
现在这种方式工作正常,但它不是那么有能力.我试图找出如何从空间中的字符串中提取单词,但这并没有成功.
我试图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) 我需要删除在2010年1月1日之前创建的所有表.我在stackoverflow中遇到了一些示例,但没有一个符合我的需要.与主键没有冲突,这是一个好点.它必须在pl/sql中,但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似乎有点矫枉过正.
在上面的示例中尝试关闭块时,我做了一些简单的错误吗?
谢谢你的帮助.
我正在执行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) plsql ×10
oracle ×9
sql ×5
dynamic-sql ×1
function ×1
split ×1
sql-update ×1
string ×1
tokenize ×1
triggers ×1