如何在程序中显示光标?

时间:2019-03-25 14:54:45

标签: oracle stored-procedures plsql cursor

我必须显示团队中具有相同经理的每个人的名字和姓氏(他的名字和姓氏取自参数)。

我在VARCHAR2之前尝试了“ IN”。我确实使用了set serveroutput。 此外,分别从光标中选择是可行的。

from PyQt5 import QtCore, QtGui, QtWidgets

class Circle(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Circle, self).__init__(parent)
        self.resize(250,500)
        self.setWindowTitle("Bounce-Man")
        self.color = QtGui.QColor(QtCore.Qt.red)
        self.rect_circle = QtCore.QRect(0, 0, 50, 50)
        self.rect_circle.moveCenter(QtCore.QPoint(self.width()/2, self.rect_circle.height()/2))
        self.step = QtCore.QPoint(0, 5)
        self.y_direction = 1

        timer = QtCore.QTimer(self, interval=30)
        timer.timeout.connect(self.update_position)
        timer.start()

    def paintEvent(self,event):
        bouncer = QtGui.QPainter(self)
        bouncer.setPen(QtCore.Qt.black)
        bouncer.setBrush(self.color)
        bouncer.drawEllipse(self.rect_circle)

    @QtCore.pyqtSlot()
    def update_position(self):
        if self.rect_circle.bottom() > self.height() and self.y_direction == 1:
            self.y_direction = -1
        if self.rect_circle.top() < 0 and self.y_direction == -1:
            self.y_direction = 1
        self.rect_circle.translate(self.step * self.y_direction)
        self.update()

if __name__ == "__main__":
    import sys
    window = QtWidgets.QApplication(sys.argv)
    app = Circle()
    app.show()
    sys.exit( window.exec_() )

我不知道为什么没有参数会起作用,但是如果我添加了这些参数,则光标为空并且不显示任何内容。

1 个答案:

答案 0 :(得分:1)

谁知道?该过程本身看起来还不错(除了您打开TEAM游标并从ZESPOL(从未声明过)中获取该事实之外。

  • 可能是字母大小写(那些名字是用小写/大写/混合大小写)吗?
  • 您对参数的顺序感到困惑吗?先姓,再姓?反之亦然(即imi VARCHAR2, nazw VARCHAR2
  • 始终使用别名,尤其是当您两次使用同一张表(或多次)时

下面是一个测试案例,说明如果正确使用它,它会正常工作。请注意,我已经切换到游标FOR循环,这更易于维护。

SQL> create table people
  2    (id_ppl     number,
  3     name       varchar2(10),
  4     surname    varchar2(10),
  5     id_manager number);

Table created.

SQL> insert all
  2    into people values (1, 'Little', 'Foot', 1)   --> the same ...
  3    into people values (2, 'Big'   , 'Foot', 1)   --> ... manager
  4    into people values (3, 'Stack' , 'Over', 2)
  5  select * from dual;

3 rows created.

SQL> set serveroutput on;

过程:

SQL> create or replace procedure ex_2h (p_nazw in varchar2, p_imi in varchar2)
  2  is
  3  begin
  4    for tmp in (select p.name from people p
  5                where p.id_manager = (select p1.id_ppl
  6                                      from people p1
  7                                      where p1.name = p_imi
  8                                        and p1.surname = p_nazw
  9                                     )
 10               )
 11    loop
 12      dbms_output.put_line(nvl(tmp.name, '?'));
 13    end loop;
 14  end;
 15  /

Procedure created.

测试:

SQL> exec ex_2h('Foot', 'Little');
Little
Big

PL/SQL procedure successfully completed.

SQL>

我建议您尝试这种方式。如果它不起作用,请发布更多信息-CREATE TABLE和示例数据,以便我们可以看到您真正拥有的内容以及Oracle的响应方式(以及原因)。