我有这个匿名 PL/SQL 块,它计算并打印从表中返回的值。
DECLARE
U_ID NUMBER :=39;
RETAIL BINARY_FLOAT:=1;
FLAG NUMBER;
BEGIN
SELECT NVL(RETAIL_AMOUNT,1),UNIT_ID INTO RETAIL, FLAG FROM UNITS WHERE UNIT_ID=U_ID;
LOOP
SELECT NVL(MAX(UNIT_ID),U_ID) INTO FLAG FROM UNITS WHERE FATHER_ID=FLAG;
IF FLAG=U_ID THEN EXIT; END IF;
SELECT RETAIL* RETAIL_AMOUNT INTO RETAIL FROM UNITS WHERE UNIT_ID=FLAG;
EXIT WHEN FLAG=U_ID;
END LOOP;
DBMS_OUTPUT.PUT_LINE( RETAIL);
END;
Run Code Online (Sandbox Code Playgroud)
这个块工作正常,但我想使用 PL/SQL 函数做同样的事情
我写的函数如下:
CREATE OR REPLACE FUNCTION GET_UNIT_RETAIL(U_ID NUMBER)
RETURN NUMBER
IS
RETAIL BINARY_FLOAT:=1;
FLAG NUMBER;
BEGIN
SELECT NVL(RETAIL_AMOUNT,1),UNIT_ID
INTO RETAIL, FLAG
FROM UNITS
WHERE UNIT_ID=U_ID; …Run Code Online (Sandbox Code Playgroud) 我有数字数据:
123.42
12.54
1.02
2.99
Run Code Online (Sandbox Code Playgroud)
对于每一个,我想获得最接近 0.5 步的数字。所以
func(123.42)=123.0
func(12.54)=12.5
func(1.02)=1.0
func(2.99)=2.5
Run Code Online (Sandbox Code Playgroud)
有什么线索吗?我正在尝试,trunc((x-floor(x))*5)/5)但什么也得不到。
我的目标是通过在插入之前检查列中的现有值来防止插入重复数据。这与在 MS SQL 中使用“IF NOT EXISTS ()...”的效果相同。
我无法在 Oracle 11g 中完成此操作。我了解 Oracle PLSQL 不提供相同的语句来执行此操作。请纠正我的理解。
在我的研究中,我发现“合并”是实现这一目标的一种方式。
我的 PLSQL 在下面,但是不起作用。查询结果为“0 行合并”
EMP 表确实具有 ID 的 IDENTITY COLUMN,如下表所示。
MERGE INTO EMP E
USING
(SELECT ID, EMAIL FROM EMP WHERE EMAIL = 'test@email.com') T
ON (E.EMAIL = T.EMAIL)
WHEN NOT MATCHED THEN
INSERT
(
F_NAME
, L_NAME
, EMAIL
)
VALUES
(
'Employee'
, 'Test'
, 'ZZZZ@email.com'
);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
EMP 表的表示如下
"EMP" TABLE
ID F_NAME L_NAME EMAIL
------- ------------ ------------ ------------
1 John Smith …Run Code Online (Sandbox Code Playgroud) 我们如何生成以 1001 开头的序列号并在 select 语句中使用,并用 '0's 将序列值 lpad 。这用于将记录从 Db 表插入到 CSV 文件中,此代码写在 cursor 中。任何人都可以建议最好的方法来做到这一点。我有一个示例查询,查询是否有效?
select lpad((create sequence customer.seq as int start with 1001 increment by 1),11,0);
Run Code Online (Sandbox Code Playgroud) 在 oracle 包的初始化部分,我尝试确定具有给定名称的某些对象的当前 ID。原因:该包用于多个数据库,这些对象的 ID 可能会有所不同,但它们的名称是不变的。
代码如下所示:
SELECT id INTO varCat FROM myTable WHERE Type = 'Object' AND Name = 'Cat';
SELECT id INTO varDog FROM myTable WHERE Type = 'Object' AND Name = 'Dog';
...
SELECT id INTO varMouse FROM myTable WHERE Type = 'Object' AND Name = 'Mouse';
Run Code Online (Sandbox Code Playgroud)
有没有办法优化查询,也许可以在单个查询中完成?
我希望以下代码在返回 1 之前打印“abc”。
即使我跑了set serveroutput on,它仍然没有打印任何东西。
如果它不是一个函数,而是一个过程,它就会起作用。
有人可以向我解释我做错了什么吗?
谢谢。
CREATE OR REPLACE FUNCTION test (
code NUMBER
) RETURN NUMBER
IS
BEGIN
dbms_output.put_line('abc');
RETURN 1;
END;
SELECT
test(30)
FROM
dual;
Run Code Online (Sandbox Code Playgroud) 我正在运行最基本的 oracle sql 脚本并在 sqlplus 中运行它。我不明白为什么我的脚本停止提示我输入“为行输入值”。FOR LOOP 不是应该在循环之前打开游标吗?
代码是:
/*
File: myTest.sql
*/
SET SERVEROUTPUT ON SIZE UNLIMITED
SET LINESIZE 140
SET PAGESIZE 60
SET ECHO OFF
SET TERM ON
SET FEEDBACK OFF
SET SHOW ON
SET VERIFY OFF
SPOOL &1
/* Run Parameters & Variables */
DECLARE
text_line VARCHAR2(4000);
/* Cursors & Row Types */
CURSOR myCursor IS
select spriden_pidm, spriden_id, spriden_first_name, spriden_last_name from spriden where spriden_id = '1234';
myCursorRec myCursor%ROWTYPE;
/* Main Logic */
BEGIN
/* Read through …Run Code Online (Sandbox Code Playgroud) 我需要创建test没有数据的物化视图,然后我将创建一个脚本来第一次将数据插入到这个物化视图中。在此之后,我将每晚运行物化视图刷新以刷新视图。
由于我不是物化视图的专家,任何人都可以在这里帮助我。
目前我有脚本来创建物化视图,该视图运行 2 小时,处理 2000 万行。
create materialize view
我正在尝试从多个表中删除行,但在 medewerkers m 中出现语法错误,
谁能告诉我我在这里做错了什么?:
declare
v_mnr medewerkers.mnr%type;
procedure ontsla_med(p_mnr in medewerkers.mnr%type)
IS
BEGIN
DELETE FROM medewerkers m, INSCHRIJVINGEN i , UITVOERINGEN u WHERE m.MNR = p_mnr and i.cursus = p_mnr and u.docent = p_mnr;
END ontsla_med;
BEGIN
ontsla_med(7000);
END;Run Code Online (Sandbox Code Playgroud)
好像删除语句是错误的?
我有一个存储过程,其中 Execute Immediate 将调用“Begin ... End”块,其中包含另一个 Execute Immediate,只有在满足特定条件时才会调用该块。
"Begin... End clock" 内部的 Execute Immediate 命令用单引号括起来。所以它看起来像
BEGIN
...SOME STUFF HERE...
FOR ..... LOOP
EXECUTE IMMEDIATE
'BEGIN
IF (condition) THEN
EXECUTE IMMEDIATE 'DML STRING'
END IF
END;'
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
这就引出了另一个问题,是否可以从循环内调用 Execute Immediate 语句。我认为答案是肯定的。