标签: plsql

PL/SQL:在存储过程中使用IN参数重写SELECT语句

假设我有一个包含下表的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语句?

请注意,这是我之前提出的问题

如何以编程方式在PL/SQL中设置表名?

那是(正确地)批评不是一个现实的问题.

oracle plsql

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

PL / SQL引用游标中的另一个游标?

我想创建一个过程,该过程选择已分配给任何特定用户的所有记录,然后向每个分配的用户发送一封个性化电子邮件,其中包含分配给他们的记录的列表。

因此,如果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值的所有记录。

任何在适当方向上的见识或推动将不胜感激。

plsql cursor

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

在PL/SQL或SQL中使用循环杀死oracle会话

我们有这个查询:

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)

有什么建议?

sql oracle plsql oracle10g oracle11g

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

用于循环的PL/SQL游标

我相信我需要一个游标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)

oracle plsql for-loop cursor

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

Oracle 8i说PLS-00382:表达式类型错误,但我没有看到它

以下代码基于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)

csv oracle plsql oracle8i

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

在Shell脚本中执行PLSQL块的问题

我试图使用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)

oracle shell plsql

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

在PL/SQL中插入/更新

我在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)

sql plsql oracle11g plsqldeveloper

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

插入更新触发器PL/SQL后

我有一个表格,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)

triggers plsql oracle11g

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

在PL/SQL存储过程中将多个变量传递到WHERE条件

传递参数时执行此代码块时出现问题.参数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一个字符串本身而被执行.

有没有办法实现它?

sql plsql stored-procedures

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

如何在PL/SQL中的一行中打印所有数据

我正在练习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

sql oracle plsql

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