假设我有一个包含下表的Oracle 11.2数据库:
TABLE: SURVEY
PARAMETER MALE FEMALE
--------------------------
SAMPLE_SIZE 102 95
AVG_WEIGHT 170 120
AVG_HEIGHT 5.9 5.4
Run Code Online (Sandbox Code Playgroud)
这是一个示例最小PL/SQL存储过程,它选择男性的平均权重并将其(例如170)放入变量中v_stat.
PROCEDURE get_stat (gender IN VARCHAR2)
AS
v_stat number;
BEGIN
SELECT male INTO v_stat FROM survey WHERE parameter = 'avg_weight';
END get_stat;
Run Code Online (Sandbox Code Playgroud)
请注意,IN参数gender在此处不执行任何操作.我想要的是传入变量gender,它可能等于"男性"或"女性",并且gender在SELECT语句中使用某种方式(而不是"男性").目标是gender作为可用于返回的变量传入,例如,男性或女性的平均重量,如gender.
我知道我可以使用带有两个单独的SELECT语句的IF/THEN/ELSE语句,但是我想知道是否有一种优雅的方法可以通过将上面的SELECT语句中的'male'更改为其他语句来使用一个SELECT语句?
请注意,这是我之前提出的问题
那是(正确地)批评不是一个现实的问题.
我想创建一个过程,该过程选择已分配给任何特定用户的所有记录,然后向每个分配的用户发送一封个性化电子邮件,其中包含分配给他们的记录的列表。
因此,如果myTable看起来像这样:
ID Assigned
1 Joe
2 Joe
3 Shelly
Run Code Online (Sandbox Code Playgroud)
Joe的电子邮件将显示一个以行分隔的列表,其中包含记录1和2,而Shelly的电子邮件将显示记录3。
我首先开始使用游标构建过程,但是1)不确定我是否可以在另一个游标中引用游标,以及2)不知道游标是否甚至是最佳方法。
我的想法是,游标1将获取所有唯一的已分配值(Joe,Shelly),而游标2将在游标1循环内执行,并获取分配给当前游标1值的所有记录。
任何在适当方向上的见识或推动将不胜感激。
我们有这个查询:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)
我需要杀死所有具有相同SQL ID的会话
我不确定如何将各种东西连在一起,但到目前为止我有这个:
for rec in (SELECT se.sid,ss.serial#
FROM v$session ss, v$sesstat se, v$statname sn
WHERE se.statistic# = sn.statistic#
AND name like '%CPU used by this session%'
AND se.sid = ss.sid
AND ss.status = 'ACTIVE'
AND ss.username is not null
AND ss.sql_id ='f7frew3erwe'
ORDER BY value ASC) loop
ALTER SYSTEM KILL SESSION 'rec.sid,rec.serial#' IMMEDIATE; //this is the tricky part!
end loop;
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我相信我需要一个游标for循环来遍历表test_data中的street1列.我有一个程序需要测试表中的每一行.
这是我到目前为止:
cursor c1 is
street1
from test_data
Begin
If Instr(street1, ‘Cnr’, 1) >= 1;
Then
Newstreetname := Substr(street1, Instr(street1, ‘Cnr’, 1)+3);
Else if
Instr(street1, ‘PO Box’, 1) >= 1;
Then
Newstreetname:= Substr(street1, Instr(street1, ‘PO Box’, 1));
Else if
REGEXP_ Instr (street1, [\d], 1) = 0;
Then
Newstreetname:= street1;
Else if
REGEXP_ Instr (street1, [\d], 1) >= 1;
Then
Newstreetnumber:= regexp_substr(street1, '\d+(\s|\/)(\d+)?-?(\d+)?(\w {1})?');
Newstreetname:= regexp_substr(street1, '(\w+\s\w+)$');
End
Run Code Online (Sandbox Code Playgroud) 以下代码基于AskTom的一个流行线程,导出为CSV
我用内部循环中的一些代码修改了原始脚本来处理嵌入的逗号和引号字符.
我无法在Oracle 8i上编译它.
我使用DBA Studio设置utl_file_dir的值.然后我使用SQL*Worksheet运行脚本.报告的错误表明第46行是问题所在.
CREATE OR REPLACE PROCEDURE dump_table_to_csv
( p_tname IN VARCHAR2,
p_dir IN VARCHAR2,
p_filename IN VARCHAR2 )
IS
l_output utl_file.file_type;
l_theCursor INTEGER DEFAULT dbms_sql.open_cursor;
l_columnValue VARCHAR2(4000);
l_status INTEGER;
l_query VARCHAR2(1000) DEFAULT 'select * from ' || p_tname;
l_colCnt NUMBER := 0;
l_separator VARCHAR2(1);
l_descTbl dbms_sql.desc_tab;
l_quote VARCHAR2(1);
BEGIN
l_output := utl_file.fopen( p_dir, p_filename, 'w', 32760 );
-- adjust date so the format is compatible with the target system
-- in this case, PostgreSQL 9 …Run Code Online (Sandbox Code Playgroud) 我试图使用shell脚本删除具有特定后缀(作为参数$ 1传递)的表.
如果选择父表而没有删除子表,我绕过父表并增加异常块中的计数器.
当我在sql开发人员中运行此脚本并将$ 1替换为正确的值时,它可以正常工作.但是当我运行这个shell脚本时,它会被卡住.
你能看一下,让我知道,我在shell脚本中缺少什么?
码:
#!/bin/bash
cat <<ENDDROPNEWTABS >dropnewtabs.sql
set pagesize 100
DECLARE
t_cnt NUMBER;
CURSOR C001
IS
SELECT table_name FROM user_tables WHERE table_name LIKE '%$1%';
BEGIN
BEGIN SELECT COUNT(*) INTO t_cnt FROM user_tables WHERE table_name LIKE '%$1%';
END;
WHILE(t_cnt > 0) LOOP
FOR i IN C001 LOOP
BEGIN EXECUTE IMMEDIATE 'DROP TABLE '||i.table_name;
EXCEPTION
WHEN OTHERS THEN
t_cnt := t_cnt+1;
NULL;
END;
t_cnt := t_cnt-1;
END LOOP;
END LOOP;
END;
exit
ENDDROPNEWTABS
echo "Dropping the tables created …Run Code Online (Sandbox Code Playgroud) 我在PL/SQL中创建了一个过程,它根据主键将数据从一个表插入另一个表.我的程序工作正常,但我无法弄清楚如果主键已经存在,我将如何更新我的表MAIN列CODE_NUMBER.
实际上我希望MAIN表的行在其具有主键时获得UPDATED,并在主键不存在时从REGIONS插入数据.
DECLARE
variable number;
id number;
description varchar2 (100);
CURSOR C1 IS
select regions.REGION_ID variable
from regions;
BEGIN
FOR R_C1 IN C1 LOOP
BEGIN
select regions.REGION_ID,regions.REGION_NAME
into id,description
from regions
where regions.REGION_ID = R_C1.variable;
----If exists then update otherwise insert
INSERT INTO MAIN( ID, CODE_NUMBER) VALUES( id,description);
dbms_output.put_line( id ||' '|| 'Already Exists');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line( R_C1.variable);
END;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud) 我有一个表格,Student并且有一个varchar类型列status.我需要在此表上为此status列after insert or update进程设置值.我试着写一个Trigger这个.但我不能用作:new.status.它给了Error: ORA-04084: cannot change NEW values for this trigger type.我怎么能这样做?
我的守则
create or replace
TRIGGER STUDENT_AIU_TRI
AFTER INSERT OR UPDATE ON STUDENT
FOR EACH ROW
DECLARE
v_status VARCHAR2(2);
BEGIN
v_status := '1';
select v_status into :NEW.status from dual;
END;
Run Code Online (Sandbox Code Playgroud) 传递参数时执行此代码块时出现问题.参数rf是要输入WHERE子句的变量列表.要输入的变量数不是静态的.
create or replace
procedure test_pl(rf in varchar2)
IS
counter number;
BEGIN
select count(*) into counter from test_pl_imp where column_name in (rf);
dbms_output.put_line(counter);
END;
Run Code Online (Sandbox Code Playgroud)
执行代码如下:
declare
inparam varchar2(20) := 'xyz,ran,dom';
begin
goku.test_pl(inparam);
end;
/
Run Code Online (Sandbox Code Playgroud)
我希望WHERE条件执行如下:
where column_name in ('xyz','ran','dom');
Run Code Online (Sandbox Code Playgroud)
但它会被视为xyz,ran,dom一个字符串本身而被执行.
有没有办法实现它?
我正在练习pl/sql程序.我有一个程序,即:示例:
begin
for i in 1..10
loop
dbms_output.put_line(i);
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
1
2
3
.
.
.
10
Run Code Online (Sandbox Code Playgroud)
但是我必须在一行中打印所有数字,即(123.....10)我怎么能这样存档,我会得到输出是这样的:123...10