create or replace procedure Q1
(tabname river.name%TYPE,x1 secretunit.tclevel%TYPE,y1 secretunit.tclevel%TYPE,x2 secretunit.tclevel%TYPE,y2 secretunit.tclevel%TYPE)
IS
BEGIN
  select a.name from tabname a where SDO_RELATE(a.GEOLOC,MDSYS.SDO_GEOMETRY(2003,8307,NULL,
  MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
  MDSYS.SDO_ORDINATE_ARRAY(x1,y1,x2,y1,x2,y2,x1,y2,x1,y1)),
  'mask=anyinteract querytype=WINDOW')='TRUE';---这行总变灰,怎么改呀?
END Q1;
谢谢各位!!

解决方案 »

  1.   

    好像整个存储过程就一个select语句,但存储过程中不能执行纯粹的select语句要返回结果要用select into语句,结果集用游标或者写包程序
      

  2.   

    1 表名等是IN参数,需要用到动态sql处理()
    2 要用select into语句,或用游标
      

  3.   

    现在问题就集中在:用变量替换表名时出错,我们在SQL*PLUS中可以用&table_name来输入变的表名,可在PL/SQL的存储过程中怎么用变量替代呢我写的 
    create or replace procedure T2
    (tabname river.name%TYPE)
      IS
    v_name number;
    BEGIN
      select count(*) into v_name from tabname ;(--改为&&tabname也是INVALID,改为具体表名如river,然后去掉上头的参数就是valid的。)
      DBMS_OUTPUT.PUT_LINE(to_char(v_name));
    END T2;请教该怎么改呢?谢谢
      

  4.   

    TO:zhaojx9(ag),如果表名等是IN参数,需要用到动态sql处理(),该怎么作呢?
      

  5.   

    DBMS_OUTPUT.PUT_LINE(to_char(v_name));在SQL*PLUS 中怎么没有输出值?
      

  6.   

    sql := 'select ...';
    execute immediate sql;
      

  7.   

    SAMPLE:
    DECLARE
       sql_stmt    VARCHAR2(200);
       plsql_block VARCHAR2(500);
       emp_id      NUMBER(4) := 7566;
       salary      NUMBER(7,2);
       dept_id     NUMBER(2) := 50;
       dept_name   VARCHAR2(14) := 'PERSONNEL';
       location    VARCHAR2(13) := 'DALLAS';
       emp_rec     emp%ROWTYPE;
    BEGIN
       EXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, amt NUMBER)';
       sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)';
       EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;
       sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
       EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;   ------------你要的
       plsql_block := 'BEGIN emp_pkg.raise_salary(:id, :amt); END;';
       EXECUTE IMMEDIATE plsql_block USING 7788, 500;
       sql_stmt := 'UPDATE emp SET sal = 2000 WHERE empno = :1
          RETURNING sal INTO :2';
       EXECUTE IMMEDIATE sql_stmt USING emp_id RETURNING INTO salary;
       EXECUTE IMMEDIATE 'DELETE FROM dept WHERE deptno = :num'
          USING dept_id;
       EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';
    END;
      

  8.   

    sql := 'select ...'||'…………';
    execute immediate sql;不能直接写参数。