Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 这个工会会员有什么问题_Oracle_Plsql - Fatal编程技术网

Oracle 这个工会会员有什么问题

Oracle 这个工会会员有什么问题,oracle,plsql,Oracle,Plsql,我有点困惑,不明白为什么会出现这个错误。 到目前为止,我想在SQLDeveloperPLSQL 因为我有一个多参数要发送,所以我使用了UNION,但到目前为止,这不起作用 FUNCTION SEARCH_CLIENT(name IN VARCHAR2) RETURN SYS_REFCURSOR IS rc SYS_REFCURSOR; BEGIN OPEN rc FOR SELECT * FROM clients WHERE Name LIKE '%name%';

我有点困惑,不明白为什么会出现这个错误。 到目前为止,我想在SQLDeveloper
PLSQL
因为我有一个多参数要发送,所以我使用了
UNION
,但到目前为止,这不起作用

FUNCTION SEARCH_CLIENT(name IN VARCHAR2)
    RETURN SYS_REFCURSOR IS 
    rc  SYS_REFCURSOR;
BEGIN
OPEN rc FOR 
     SELECT * FROM clients WHERE Name LIKE '%name%';
     UNION 
    SELECT * FROM clients WHERE Number LIKE '%name%'
     UNION
    SELECT * FROM clients WHERE Company LIKE '%name%'
     UNION
    SELECT * FROM clients WHERE Address LIKE '%name%'
     UNION
    SELECT * FROM clients WHERE CompanyId LIKE '%name%' 
     UNION
    SELECT * FROM clients WHERE InvoiceAddress LIKE '%name%'
     UNION
    SELECT * FROM clients WHERE Worker_name LIKE '%name%'
     UNION
    SELECT * FROM clients WHERE PostNumber LIKE '%name%';
RETURN rc;
END SEARCH_CLIENT;
我会犯这样的错误

Error(19,33): PL/SQL: ORA-00936: missing expression

Error(17,6): PL/SQL: SQL Statement ignored
两个明显的错误:

SELECT * FROM clients WHERE Name LIKE '%name%';    --> remove semi-colon
 UNION 
SELECT * FROM clients WHERE Number LIKE '%name%'   --> number is invalid column name

稍微不那么明显一点:
一样是行不通的。你必须使用

WHERE Name LIKE '%' || name ||'%'
否则,您将搜索包含“name”的字符串。此外,若列名等于参数名,则会得到错误的结果;将参数名称更改为,例如
par_name
,然后

WHERE Name LIKE '%' || par_name ||'%'

UNION从两个子查询生成一个结果集。这是一个单一的声明。因此,您需要从UNION关键字前面的第一个子查询中删除分号。

第一个UNION之后有一个分号

另外,这是一个糟糕的SQL语句,速度慢且效率低


在生产环境的应用程序代码中使用*是一种不好的做法命名列而不是使用*总是好的

如果不使用like,那么可以将所有where语句组合成一个where子句

SELECT * FROM clients WHERE 'name' in (name, number)....;
  • 使用union时,不需要使用分号(;) 在每个select语句之后
  • 在我们必须使用的oracle函数和过程中使用Like 与“%”名称“%”类似的浓缩

您的意思是,不要使用联合使用或类似SELECT*FROM之类的语句。。。。或者从…中选择*如从客户机中选择*,其中名称如“%name%”或公司如“%name%”或地址如“%name%”或公司如“%name%”或发票地址如“%name%”谢谢你的建议。我很感激:-)因为我有20多列,在
SELECT
station:D中写20列要花我的时间但是我接受你的回答,你是100%对的。如果你使用SQL developer,你可以简单地拖动表名,它会给你选择所有名为的列的选项。)谢谢你的建议:=)